【问题标题】:Android sql creating database onceAndroid sql一次创建数据库
【发布时间】:2011-01-07 23:55:51
【问题描述】:

我想一次性创建数据库和所有数据,并在以后需要时更新一些数据。在我阅读的大部分教程中,它们使用两个类:一个扩展 SQLiteOpenHelper,另一个简化数据操作。例如:

public class EventsData extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "events.db";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "CREATE TABLE " + TABLE_NAME + "(" + ID + " INT, " + TITLE + " TEXT, " + UNLOCK + " INT)";
private static final String DATABASE_UPGRADE = "DROP TABLE IF EXISTS " + TABLE_NAME;

public EventsData(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_UPGRADE);
    onCreate(db);
}

}

public class DataHelper {

private static final String[] FROM = {ID, TITLE, UNLOCK};
//private static final String ORDER_BY = UNLOCK + " DESC";

private Context context;
private SQLiteDatabase db;
private EventsData eventsData;

public DataHelper(Context context) {
    this.context = context;
    eventsData = new EventsData(this.context);
}

public void addEvent(int id, String name, int unlocked) {
    db = eventsData.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(ID, id);
    cv.put(TITLE, name);
    cv.put(UNLOCK, unlocked);
    db.insertOrThrow(TABLE_NAME, null, cv);
}

public void updateEvent(int id, String name, int unlocked) {
    db = eventsData.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(ID, id);
    cv.put(TITLE, name);
    cv.put(UNLOCK, unlocked);
    db.update(TABLE_NAME, cv, ID + "=" + id, null);
}

public Cursor getEvent() {
    db = eventsData.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, null);
    return cursor;
}

public StringBuilder showEvent(Cursor cursor) {
    StringBuilder sb = new StringBuilder();
    while (cursor.moveToNext()) {
        String id = cursor.getString(0);
        String title = cursor.getString(1);
        String unlock = cursor.getString(2);
        sb.append(id).append(": ");
        sb.append(unlock).append(": ");
        sb.append(title).append("\n");
    }
    return sb;
}

public void deleteAll() {
    db = eventsData.getWritableDatabase();
    db.delete(TABLE_NAME, null, null);
}

}

在我的主要活动中,我创建了一个 DataHelper 实例并调用 addEvent() 来创建数据并将其添加到数据库中。但是每次应用程序启动时,即使我要调用 updateEvent(),它也会“重置”所有数据。

【问题讨论】:

    标签: java android sql database


    【解决方案1】:

    您可以使用 DBVersion 来控制此行为。

    如果您正在扩展 SQLiteOpenHelper,您可以在构造函数中传递 DBVersion。 代码 sn-p 如下。

    private static final int DATABASE_VERSION = 1;
    public MyDBHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
    }
    

    查看属性版本 doco http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#SQLiteOpenHelper%28android.content.Context,%20java.lang.String,%20android.database.sqlite.SQLiteDatabase.CursorFactory,%20int%29

    任何必须第一次(仅)执行的代码都需要添加到 onCreate() 方法中。要控制后续的数据库更改(例如更改表、更新表等),应在 onUpdate 中处理。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      目前还不清楚你想要什么。您想在创建数据库时运行一次命令,或者您想更频繁地运行。如果您只想在创建时运行它们,但在 oncreate 中运行它们。如果您想运行它们其他次数,请将它们放在其他地方。现在我不知道你要做什么或问题是什么。

      【讨论】:

      • 只想创建一次数据库。在更新数据时,我想使用我创建的 DataHelper 类来简化事情。
      • 只有在未创建数据库时才应调用您的 databaseHelper 的 onCreate 方法。所以不清楚你的问题是什么。
      【解决方案3】:

      您可以在 SQLiteOpenHelper 中覆盖两个函数,即 onCreate() 和 onUpgrade()。如果设备上不存在数据库和表,则调用 onCreate(),然后为您创建文件。如果您将不同的版本号传递给构造函数中的助手,则会调用 onUpgrade()。如果您只需要对设备上的数据库进行一次重要更改,这将非常有用。

      private class DatabaseOpenHelper extends SQLiteOpenHelper {
      
                              public DatabaseOpenHelper(Context context, String name, int version) {
                                  super(context, name, null, version);
                              }            
      
                              @Override
                              public void onCreate(SQLiteDatabase db) {
                                  try {
                                      //Create tables here
                                      db.execSQL("CREATE TABLE " + table_name + args);
                                  } catch(SQLException e) {
                                      //Database error
                                  }
                              }
      
                              @Override
                              public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                                  //This will be called if your database version ever changes
                                  this.onCreate(db);
                              }
      }
      

      希望这对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-03-02
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多