Android:创建SQLite数据库和表的最佳位置是什么

时间:2012-06-04 14:35:32

标签: android sqliteopenhelper

我必须在我的Android应用程序中创建近5-6个表。创建SQLite数据库和5-6个表的最佳位置是什么?我可以在初始活动启动时编写所有这些逻辑(使用SQLite打开辅助方法),但是如果我这样做,它将在每次初始活动启动时被调用。这意味着每次应用程序启动时都会执行这些数据库和表的创建逻辑。任何人都可以告诉最佳实践。

4 个答案:

答案 0 :(得分:1)

如果编写一个类来扩展SQLiteOpenHelper并在onCreate方法中创建表,它将只执行一次。如果您从设备中完全删除数据/应用程序,则帮助程序将仅重新创建数据。

From developer.android.com:第一次创建数据库时调用。这是表的创建和表的初始填充的地方。

为您提供更多信息。 在用于扩展SQLiteOpenHelper的类的构造函数中,调用超级构造函数,该构造函数接受一些参数。其中一个是数据库版本。

如果这个传递给超级构造函数的db_version与最后传递的那个不同,则调用onUpgrade方法,在onUpgrade()方法中可以调用onCreate()

这样:

  1. 删除数据/应用
  2. 导致调用onUpgrade调用onCreate()
  3. 是创建/续订/删除数据库的方法

答案 1 :(得分:0)

您可以在主要活动中创建数据库和表格

但在创建数据库之前,您可以检查

if(exits())
{
   // do not create
}
else
{
   // create here
}

答案 2 :(得分:0)

Personnaly,我使​​用选项:CREATE TABLE IF NOT EXISTS

所以开放帮手有这个参数:

 private static final int VERSION_BDD = 1;

我认为openHelper在每次发布时都不会重新创建每个表。

答案 3 :(得分:0)

您可以使用内部类扩展SQLiteOpenHelper并覆盖方法public void onCreate(SqLiteDatabase sqlLiteDatabase)和public void onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion,int newVersion)

当磁盘中不存在数据库并且辅助类需要创建新数据时,将调用onCreate

当存在db版本不匹配时,将调用onUpgrade。磁盘上的db版本需要升级到newVersion

private static final class PatientDatabaseHelper extends SQLiteOpenHelper {

    private static final String TAG = "PatientProvider";

    private static final String DATABASE_NAME = "myPatient.db";
    private static final int DATABASE_VERSION = 1;
    private static final String PATIENT_TABLE = "PATIENT";

    private static final String CREATE_TABLE_PATIENT =
            "create table " + PATIENT_TABLE + " ("
                    + PATIENT_KEY_ID + " integer primary key autoincrement, "
                    + PATIENT_NAME + " TEXT NOT NULL, "
                    + PATIENT_FIRST_NAME + " TEXT NOT NULL, "
                    + PATIENT_TEL + " TEXT, "
                    + PATIENT_GSM1 + " TEXT, "
                    + PATIENT_GSM2 + " TEXT, "
                    + PATIENT_BIRTHDATE + " DATE); ";



    public PatientDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_TABLE_PATIENT);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
       //simple case sample - droppin the table
       sqLiteDatabase.execSQL("DROP TABLE IF IT EXISTS " + PATIENT_TABLE);


      //Create a new One
      onCreate(sqLiteDatabase);

    }
}

取决于android的目标版本,但我认为一个好的方法是使用ContentProvider http://developer.android.com/guide/topics/providers/content-provider-creating.html