android(数据库)

时间:2011-12-11 10:05:05

标签: android sqlite

我想在我的android项目中使用数据库。我编写代码,但我很好奇:当我在手机中运行apk文件时,数据库每次都会再次渲染,或者它只是第一次创建数据库?因为我想第一次建立数据库?我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

数据库将在您第一次尝试访问时创建,并且从那时起将持续存在,即使在安装较新版本的应用程序时也是如此。

希望有所帮助。

答案 1 :(得分:1)

您的数据库'helper'应至少覆盖onCreate方法,以便仅在数据库中创建一次表(首次在设备上创建数据库时)....

public class ExampleDatabaseHelper扩展了SQLiteOpenHelper {

    public static final String DB_NAME = "ExampleDb";
    public static final int DB_VERSION = 1;
    public static final String TABLE_NAME = "ExampleTable";
    private static final String TABLE_CREATE_SQL = 
            "CREATE TABLE " + TABLE_NAME +" (" + 
                "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "Name TEXT NOT NULL " +
            ")";

    public ExampleDatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {           
        db.execSQL(TABLE_CREATE_SQL);
    }
}

...在开发应用程序时,您可能希望对数据库结构进行更改,因此您可能希望删除这些现有表并运行新SQL以重新创建它们。

您可以通过覆盖onUpdate方法来执行此操作,但每次更改架构时都必须记住增加数据库版本,以便触发onUpdate ...

   public class ExampleDatabaseHelper extends SQLiteOpenHelper {

    public static final String DB_NAME = "ExampleDb";
    public static final int DB_VERSION = 2;
    public static final String TABLE_NAME = "ExampleTable";
    private static final String TABLE_CREATE_SQL = 
            "CREATE TABLE " + TABLE_NAME +" (" + 
                "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "Name TEXT NOT NULL, " +
                "PhoneNumber TEXT NOT NULL" +
            ")";

    public ExampleDatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {           
        db.execSQL(TABLE_CREATE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

}

在已发布的应用程序中,您可能希望改进onUpdate以保留新格式的先前版本的数据,但在开发过程中,上述操作可以。 这个例子很简单,因为它只处理数据库中的一个表。我建议使用静态方法为每个表创建一个类来处理该表的onCreate和onUpgrade,这些是从帮助程序类中调用的...

public class ExampleDatabaseHelper extends SQLiteOpenHelper {

    public static final String DB_NAME = "ExampleDb";
    public static final int DB_VERSION = 1;

    public ExampleDatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {   
        ExampleTable1.onCreate(db);
        ExampleTable2.onCreate(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        ExampleTable1.onUpgrade(db, oldVersion, newVersion);
        ExampleTable2.onUpgrade(db, oldVersion, newVersion);
    }
}