Android编程权威指南(第二版)第十四章-SQLite数据库
savedInstanceState无法满足应用持久化保存数据的需求,Android为此提供了长期存储地:手机或平板设备闪存上的本地文件系统。Android设备上的应用都有一个沙盒目录。将文件保存在沙盒中,可阻止其他应用甚至是设备用户的访问和窥探。当然,设备被root了的话,用户就可以随意访问各种目录和文件了。应用沙盒目录是/data/data/[your package name]的子目录。
怎么办呢?该是SQLite闪亮登场的时候了。 SQLite是类似于MySQL和Postgresql的开源关系型数据库。不同于其他数据库的是, SQLite使用单个文件存储数据,使用SQLite库读取数据。Android标准库包含SQLite库以及配套的一些Java辅助类。如需深入学习,请访问网站http://www.sqlite.org,阅读SQLite完全使用手册。
第一步,写一个定义数据表字段的类,这样在取表项的时候对应的名称不会弄错,相当于只是一个存string的类。此外,这种定义方式还给修改字段名称或新增表元素带来了方便。
public class **DbSchema {
public static final class **Table {
public static final String NAME = "crimes";//表名
public static final class Cols { //表列的名称
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String SOLVED = "solved";
}
}
}
第二步,建立数据库,在实际的开发中,建议遵循以下步骤:
(1) 确认目标数据库是否存在。
(2) 如果不存在,首先创建数据库,然后创建数据库表以及必需的初始化数据。
(3) 如果存在,打开并确认DbSchema是否是最新版本
(4) 如果是旧版本,就运行相关代码升级到最新版本。
Android提供的SQLiteOpenHelper类可以帮我们处理这些,我们继承并重写他的方法就很方便。
public class **BaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DATABASE_NAME = "nameOfDbFile.db";
public **BaseHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//负责创建初始数据库
db.execSQL("create table " + CrimeTable.NAME + "(" +....+")" );
//数据库的创建表的语句,数据库知识这里就不详写了
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//负责与升级相关的工作
}
}
第三步,打开数据库。创建一个**Lab的单例类,用来存放数据库实例,并且实现数据库增查删改所有所需方法
public class **Lab {
...
private Context mContext;
private SQLiteDatabase mDatabase;
...
private **Lab(Context context) {
mContext = context.getApplicationContext();
mDatabase = new CrimeBaseHelper(mContext)
.getWritableDatabase();
}
//接下来这里可以对数据库增查删改写对应的方法,以添加方法为例
public void add**(数据对应的类名 ***) {
ContentValues values = getContentValues(***);
mDatabase.insert(***Table.NAME, null, values);
//第一个参数是数据库表名,第三个参数是数据库记录,调用下面的方法获得
}
private static ContentValues getContentValues(数据对应的类名 ***) {
ContentValues values = new ContentValues();
values.put(CrimeTable.Cols.表项名, ***.对应数据);
...//将对象更多的数据,放到更多的表项中
return values;
}
}
这里调用getWritableDatabase()方法时, CrimeBaseHelper要做刚开始的四项工作
(1) 打开/data/data/com.bignerdranch.android.criminalintent/databases/crimeBase.db数据库;如果
不存在,就先创建crimeBase.db数据库文件。
(2) 如果是首次创建数据库,就调用onCreate(SQLiteDatabase)方法,然后保存最新的版本号。
(3) 如果已创建过数据库,首先检查它的版本号。如果CrimeOpenHelper中的版本号更高,就调用onUpgrade(SQLiteDatabase, int, int)方法升级。
第四步,当然是在代码中调用**Lab中的方法,实现数据库与用户操作同步更新。
...........................................................略
这一部分还涉及很多数据库的基本知识,查找功能代码太多,先了解一下Android是如何使用数据库的吧。

浙公网安备 33010602011771号