第九个项目——新闻列表2
实验目的
掌握SQLite存储关系型数据的方法;
掌握SQLiteOpenHelper、SQLiteDatabase等类的常用方法;
掌握Cursor进行数据集遍历的方法;
掌握CursorAdapter适配器类的使用方法;
实验要求
使用SQLiteOpenHelper进行数据库创建及管理;
使用SQLiteDatabase进行数据库操作;
使用Cursor、CursorAdapter**进行数据查询及展示;
实验内容
步骤一,打开Code07项目
使用Android Studio打开Code07项目。
本次项目的目的是将MainActivity中ListView的数据源转换为从SQLite数据库中读取。
步骤二,创建News的合约类——NewsContract
新建名为NewsContract类,该类包含了News表的所有原数据信息,代码如下所示。
将NewsContract类的构造方法访问符设为private,避免其他开发人员实例化该类。 在NesContract类中定义了名为NewsEntry的内部类,该类实现了BaseColumns接口,主要作用是为NewsEntry类新增一个名为_ID的字段名。
步骤三,自定义SQLiteOpenHelper子类
1. 自定义SQLiteOpenHelper子类
定义名为MySQLiteOpenHelper类,该类继承于SQLiteOpenHelper,主要用于对数据库的创建及版本管理。 在该类中首先定义两个字符串常量表示News数据库表的创建和删除SQL语句,如代码\ref{lst:code07_sql_statement}所示。
在MySQLiteOpenHelper类中还定义了两个常量DATABASE_VERSION 和DATABASE_NAME分别表示数据库的版本及数据库名。
2. 定义构造函数及重载onCreate()方法
SQLiteOpenHelper基类构造函数接收四个参数:
Context context,上下文对象;
String name,数据库名;
SQLiteDatabase.CursorFactory factory,创建Cursor的工厂类,默认传递null即可;
int version,数据库版本号;
如果数据库结构发生了变化,则递增version即可。
onCreate()方法在数据库文件不存在时将被执行,通常只执行一次,因此在该方法中应该完成数据库表的创建以及数据初始化的操作,代码如下所示。
3. 构造数据库初始数据
在实际开发中,数据库的初始数据可能通过网络进行获取或者通过第三方途径获取。 在本项目中为了简便起见,将原来从string.xml构造的数据放入数据库中。 把初始化数据的功能代码放在initDb()方法中。
initDb()方法的参数是SQLiteDatabase对象,在调用该方法时确保SQLiteDatabase对象已经被初始化。 常见的做法是将initDb()方法放入MySQLiteOpenHelper类的onCreate()方法中。
4. 重载onUpgrade()方法
由于数据库文件存储于App的私有目录内,当数据库结构发生变化时,通常意味着该数据库中的表结构需要进行调整。正确的做法是将DATABASE_VERSION值递增,并重载onUpdate()方法,在该方法中实现调整数据库表结构的逻辑。
在本项目中进将数据库表进行删除,并重新调用onCreate()方法创建数据库表。
5. 读取数据库数据
通过SQLiteOpenHelper类的getReadableDatabase()方法获得SQLiteDatabase对象,并通过该对象执行query()方法查询News表中的数据。
通常数据库的查询操作比较耗时,需要结合Loader一起使用,在本项目中为了简便起见,直接在MainActivity的onCreate()方法中完成查询操作。
获得Cursor对象后,可以通过循环,借助于moveToNext(),getString()等方法读取每一条记录的字段值。 getString()等方法需要的参数是列编号,因此需要使用getColumnIndex()方法将列名转换为Cursor对象指向结果集中的列编号。
步骤四,编译、部署APK
编译并部署Code07项目的APK,运行效果应与之前的相同,但所有数据均存储与SQLite数据库中。
实验小结
通过本次实验,你应该掌握了如下知识内容:
使用SQLiteOpenHelper对数据库进行管理;
使用SQLiteDatabase进行数据操作;
使用Cursor进行数据集遍历;
Last updated
Was this helpful?