9.3. 第一个例子
9.3.第一个例子
接下来我们将创建自己的辅助类DbHelper,用以操作数据库。当数据库不存在时,它负责创建数据库;当数据库原型变化时,它负责数据库的更新。
同前面的很多类一样,它也是继承自Android框架中的某个类,也就是SQLiteOpenHelper。我们需要实现该类的构造函数,onCreate()方法和onUpgrade()方法。
例 9.1. DbHelper.java, version 1
package com.marakana.yamba4;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.util.Log;
public class DbHelper1 extends SQLiteOpenHelper { //
static final String TAG = "DbHelper";
static final String DB_NAME = "timeline.db"; //
static final int DB_VERSION = 1; //
static final String TABLE = "timeline"; //
static final String C_ID = BaseColumns._ID;
static final String C_CREATED_AT = "created_at";
static final String C_SOURCE = "source";
static final String C_TEXT = "txt";
static final String C_USER = "user";
Context context;
// Constructor
public DbHelper1(Context context) { //
super(context, DB_NAME, null, DB_VERSION);
this.context = context;
}
// Called only once, first time the DB is created
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + TABLE + " (" + C_ID + " int primary key, "
+ C_CREATED_AT + " int, " + C_USER + " text, " + C_TEXT + " text)"; //
db.execSQL(sql); //
Log.d(TAG, "onCreated sql: " + sql);
}
// Called whenever newVersion != oldVersion
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //
// Typically do ALTER TABLE statements, but...we're just in development,
// so:
db.execSQL("drop table if exists " + TABLE); // drops the old database
Log.d(TAG, "onUpgraded");
onCreate(db); // run onCreate to get new database
}
}
- 将SQLiteOpenHelper作为基类。
- 数据库文件名。
- 为数据库保留一个版本号。这在需要修改原型时将会十分有用,使得用户可以平滑地升级数据库。
- 定义数据库相关的一些常量,方便在其它类中引用它们。
- 覆盖SQLiteOpenHelper的构造函数。将前面定义的几个常量传递给父类,并保留对context的引用。
- 拼接将要传递给数据库的SQL语句。
- 在onCreate()中可以得到一个数据库对象,调用它的execSQL()方法执行SQL语句。
- onUpgrade()在数据库版本与当前版本号不匹配时调用。它负责修改数据库的原型,使得数据库随着程序的升级而更新。
Note:
早些时候曾提到,onUpgrade()中一般都是执行ALERT TABLE语句。不过现在我们的程序还没有发布,也就没有升级可言。因此便直接删除了旧的数据表并重建。
接下来我们将重构原先的Service,使之能够打开数据库,并将服务端得到的数据写入进去。