9.3. 第一个例子

优质
小牛编辑
129浏览
2023-12-01

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

}

}

  1. 将SQLiteOpenHelper作为基类。
  2. 数据库文件名。
  3. 为数据库保留一个版本号。这在需要修改原型时将会十分有用,使得用户可以平滑地升级数据库。
  4. 定义数据库相关的一些常量,方便在其它类中引用它们。
  5. 覆盖SQLiteOpenHelper的构造函数。将前面定义的几个常量传递给父类,并保留对context的引用。
  6. 拼接将要传递给数据库的SQL语句。
  7. 在onCreate()中可以得到一个数据库对象,调用它的execSQL()方法执行SQL语句。
  8. onUpgrade()在数据库版本与当前版本号不匹配时调用。它负责修改数据库的原型,使得数据库随着程序的升级而更新。

Note:

早些时候曾提到,onUpgrade()中一般都是执行ALERT TABLE语句。不过现在我们的程序还没有发布,也就没有升级可言。因此便直接删除了旧的数据表并重建。

接下来我们将重构原先的Service,使之能够打开数据库,并将服务端得到的数据写入进去。