SQLiteOpenHelper 调用 onCreate 失败?

Posted

技术标签:

【中文标题】SQLiteOpenHelper 调用 onCreate 失败?【英文标题】:SQLiteOpenHelper failing to call onCreate? 【发布时间】:2011-06-28 19:05:45 【问题描述】:

我正在尝试使用sqlite 在安卓手机上创建一个本地数据库。

我有一个帮助类,如下所示,用于创建数据库并提供“帮助”。

我想在我的代码的主要部分创建这个类的一个对象,并在那里创建数据库和表。

问题:

每当我创建一个类的对象时,它似乎并没有在帮助程序中调用onCreate 方法。我认为这应该发生。我认为onCreate 基本上是该类的构造函数。 (我相信我错了)

那么,为什么不调用onCreate 方法呢? 或者我如何获得它来创建我正在创建类的对象的数据库和表? 如果这不是一个好方法,还有什么更好的方法?
public class SmartDBHelper extends SQLiteOpenHelper 

    private static final String DATABASE_NAME = "smart_lite_db.db";
    private static final int DATABASE_VERSION = 2;
    private static final String NOTIFY_TABLE_NAME = "user_notify_data";
    private static final String HR_TABLE_NAME = "user_hr_data";
    private static final String NOTIFY_TABLE_CREATE = 
        "CREATE TABLE " + NOTIFY_TABLE_NAME + 
        " (counter INTEGER PRIMARY KEY, " + 
        "userresponse INTEGER, " + 
        "notifytime INTEGER);";
    private static final String DATA_TABLE_CREATE = 
        "CREATE TABLE " + HR_TABLE_NAME +
        " (counter INTEGER PRIMARY KEY, " +
        "hr INTEGER, " +
        "act INTEGER, " +
        "timestamp INTEGER);";      

    public SmartDBHelper(Context context) 
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    


    @Override
    public void onCreate(SQLiteDatabase db) 
        // TODO Auto-generated method stub
        Log.v("smartdbhelper", "before creation");
        db.execSQL(NOTIFY_TABLE_CREATE);
        Log.v("smartdbhelper", "middle creation");
        db.execSQL(DATA_TABLE_CREATE);
        Log.v("smartdbhelper", "after creation");
    


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        // TODO Auto-generated method stub

    



public class SmartApp extends Activity implements OnSharedPreferenceChangeListener 
   private SmartDBHelper dBHelper;
   public void onCreate(Bundle savedInstanceState) 
      //where i am wanting to create the database and tables
      dBHelper = new SmartDBHelper(getContext());
   

【问题讨论】:

【参考方案1】:

onCreate 不是数据库类的构造函数。仅当您尝试打开不存在的数据库时才会调用它。 要打开/创建数据库,您需要添加对以下方法之一的调用:

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener 
   private SmartDBHelper dBHelper;
   public void onCreate(Bundle savedInstanceState) 
      //where i am wanting to create the database and tables
      dBHelper = new SmartDBHelper(getContext());
      // open to read and write
      dBHelper.getWritableDatabase();
      // or to read only
      // dBHelper.getReadableDatabase();
   

它有点大,但这是我的 DatabaseAdapter,你可以看看:http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java

【讨论】:

酷,谢谢。如果我想要一个像你一样的课程,它包含我所有的 sql 处理内容。我如何在所有其他类中访问该类的对象?例如,我在我的主类中创建对象。现在我想在我的主类中创建的类中使用插入方法。如何访问在另一个类的主类中创建的原始 db 对象? 实际上,我是否只是在每个需要 databaseHelper 的类中创建一个新对象?我相信这是我应该做的,如果没有人回复,我可能会问这个问题。谢谢 我在这里遇到了一个问题 ..02-17 10:12:53.441: ERROR/Database(311): close() 从未在数据库'/data/data/com.ey 上显式调用。 eyconnect/databases/test.db' 02-17 10:12:53.441:错误/数据库(311):android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭在此处打开的游标或数据库对象,此处抛出异常。 .如何解决这个问题... 我解决了异常。我正在调用 db = eventsData.getReadableDatabase();这就是引发异常的两倍 @prolink:看看我项目的 GameApplication 类和清单。我自己的应用程序实现处理数据库对象的打开/关闭和持有。【参考方案2】:

您必须致电getWritableDatabase()getReadableDatabase()

【讨论】:

现在测试,我相信你是对的。我刚刚检查了android示例并发现了这一点。我一定看过了,会告诉你进展如何。谢谢【参考方案3】:

oncreate() 方法不是构造函数,也是在第一次创建数据库时调用。所以你必须调用 getWritableDatabase() getReadableDatabase() 用于打开或创建您的数据库。

getReadableDatabase() :- 创建和/或打开一个数据库。

getWritableDatabase() :- 创建和/或打开一个数据库 用于阅读和写作。

【讨论】:

以上是关于SQLiteOpenHelper 调用 onCreate 失败?的主要内容,如果未能解决你的问题,请参考以下文章

SQLiteOpenHelper存在的意义

王立平--SQLite,SQLiteOpenHelper的简单应用

android中使用SQLiteOpenHelper创建数据库

如何操作android中的数据库

Android问题:关于SQLiteOpenHelper中的onCreate创建多个表,调试时找不到表名?

SQLiteOpenHelper