【问题标题】:Android: What is the best place to create SQLite database and tablesAndroid:创建 SQLite 数据库和表的最佳位置是什么
【发布时间】:2012-06-04 14:35:31
【问题描述】:

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

【问题讨论】:

    标签: android sqliteopenhelper


    【解决方案1】:

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

    来自developer.android.com: 第一次创建数据库时调用。这就是表的创建和表的初始填充应该发生的地方。

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

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

    所以:

    1. 删除数据/应用
    2. 导致调用 onUpgrade 并调用 onCreate()

    是创建/更新/删除数据库的方法

    【讨论】:

      【解决方案2】:

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

      但是在创建数据库之前你可以检查一下

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

      【讨论】:

        【解决方案3】:

        个人,我使用选项:CREATE TABLE IF NOT EXISTS。

        所以打开的助手有这个参数:

         private static final int VERSION_BDD = 1;
        

        我认为 openHelper 不会在每次启动时重新创建每个表。

        【讨论】:

          【解决方案4】:

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

          当磁盘中不存在数据库并且助手类需要创建一个新数据库时调用onCreate

          当数据库版本不匹配时调用 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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-26
            • 1970-01-01
            • 2021-03-04
            相关资源
            最近更新 更多