Android SQLite在何时何地初始化SQLiteOpenHelper

时间:2011-05-13 15:29:36

标签: android sqlite

我真的很难在我的应用程序中使用SqlLite;

我已经设置了一个从SQLiteOpenHelper

扩展的数据库助手类
public class DatabaseHelper extends SQLiteOpenHelper {

在OnCreate我正在创建6个表:

public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE myTestTable (Id INTEGER PRIMARY KEY , "
            + "info TEXT," + 
            + "TopLeft TEXT")); <-- example insert

}

当我的应用程序启动时,我正在解析一些xml并将数据输入到表中,并且我已经检查了数据库,所有数据库都在那里并且我的表格已正确创建。

当我去调用数据时,它就消失了! 我在dbhelper类和每个活动中都有很多不同的查询;我重新启动了这个类,所以我可以在类中找到我的函数。

我认为这不是这样做的方式,因为它再次运行我的oncreate并擦除我的所有表(或者至少这是因为我在尝试从中调用数据后检查数据库时似乎正在执行它是空的!

我认为oncreate只运行一次,但显然情况并非如此,因为它似乎每次都在重新创建我的数据库并擦除我的数据!

你想在哪里初始化dbhelper类,你如何阻止它重新创建表?即使应用关闭,我也需要数据保持不变!

我很困惑!

如果这没有意义,请就如何澄清它提出具体问题!

更新

我发现我可以添加

CREATE TABLE IF NOT EXISTS

这会阻止它重新创建表格,但是每次调用oncreate似乎都没有。

4 个答案:

答案 0 :(得分:2)

你可以在它周围放一个包装类吗?

public class DbAdapter
{

  // database details
  private static final String DATABASE_NAME = "dbname";
  private static final int DATABASE_VERSION = 1;

  // where we're running
  private final Context mCtx;

  private static class DatabaseHelper extends SQLiteOpenHelper
  {
    DatabaseHelper(Context context)
    {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
      // your initial database create statements go here
      db.execSQL(DATABASE_CREATE);
    }

    // if you need to recreate the database, you just up the version number
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
      // drop commands for each table goes here
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
      onCreate(db);
    }
  }

  public DbAdapter(Context ctx)
  {
    this.mCtx = ctx;
  }

  public DbAdapter open() throws SQLException
  {
    mDbHelper = new DatabaseHelper(mCtx);
    mDb = mDbHelper.getWritableDatabase();
    return this;
  }

  public void close()
  {
    mDbHelper.close();
  }

  // other database methods can go here
}

答案 1 :(得分:1)

仅在您第一次尝试访问数据库时才调用

onCreate()方法,并且未创建该方法。所以onCreate()只会被调用一次。 getWritableDatabase返回一个db对象,如果需要,将调用onCreate()NotePadProvider为如何使用SQLiteOpenHelper提供了一个很好的示例。

答案 2 :(得分:0)

我不确定你的意思是什么意思 -

“每次活动我都会重新开始上课,这样我就可以在课堂上学习。”

在您需要访问数据库的每个活动中,您所要做的就是打开数据库,访问/更新表中的数据,然后关闭处理程序。

您是否看过这个简单的示例NotePad应用程序 -

NotePad sample app by Google

可能会有所帮助

答案 3 :(得分:0)

数据库初始化代码应该放在Helper的onCreate方法中。 来自android SQLiteOpenHelper javadocs:

/**
 * Called when the database is created for the first time. This is where the
 * creation of tables and the initial population of the tables should happen.
 *
 * @param db The database.
 */
public abstract void onCreate(SQLiteDatabase db);