Android SQLiteOpenHelper:为什么不调用onCreate()方法?

zon*_*ono 52 java android android-sqlite

我正在尝试制作我的第一款Android应用.我注意到,SQLiteOpenHelper.onCreate()如果数据库不存在,则不会调用该方法来创建表.但是,onCreate()即使我尝试调试,该方法也无法正常工作.

请查看下面的代码,并给我任何建议.任何帮助将不胜感激.

public class NameToPinyinActivity extends Activity {

    DatabaseOpenHelper helper = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nametopinyin);

        Button searchButton = (Button) findViewById(R.id.search);
        searchButton.setOnClickListener(new ButtonClickListener());

        helper = new DatabaseOpenHelper(NameToPinyinActivity.this);
    }

public class DatabaseOpenHelper extends SQLiteOpenHelper {

    /** DB Name */
    private static final String DB_NAME = "pinyin";

    /** CREATE TABLE SQL */
    private static final String CREATE_TABLE_SQL = "CREATE TABLE UNICODE_PINYIN"
            + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, "
            + "UNICODE TEXT NOT NULL, PINYIN TEXT NOT NULL)";

    public DatabaseOpenHelper(Context context) {
        super(context, DB_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.beginTransaction();
        try {
            db.execSQL(CREATE_TABLE_SQL);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Kev*_*ing 59

我也遇到过SQLiteOpenHelper问题.对我有用的是存储成员变量

SQLiteDatabase db;
Run Code Online (Sandbox Code Playgroud)

在SQLiteOpenHelper子类中并调用

 db = getWritableDatabase();
Run Code Online (Sandbox Code Playgroud)

在构造函数中.

这个问题的答案还包括有用的信息:SQLiteOpenHelper无法调用onCreate?

我希望这有帮助!

  • 这意味着数据库已经创建.仅当数据库不存在时才会调用onCreate(). (7认同)

Jat*_*wal 24

直到你调用该方法getWritableDatabase()getReadableDatabase()SQLiteOpenHelper类,数据库将不会被创建.

就像你真正需要的那样,数据库将在内存中创建一样简单.:)


Tob*_*ich 6

我有一个类似的问题,其中onCreate没有被执行.也许这对某人有用,尽管事实证明这是一个不同的问题.

我以前在数据库上工作,并且已经创建了很长一段时间.所以现在在onCreate()中进行更改后,我希望找到创建的新表.但SQLiteOpenHelper再也没有调用过onCreate().原因是,数据库已经存在.我仍在使用与之前相同的设备,因此使用现有的(旧)数据库.

但是有希望.当系统看到具有该名称的数据库已存在时,它还会检查版本号是否正确.在那种情况下,我只是忘记了数据库已经存在.我的解决方案只是更改版本号.因此,onUpgrade()被称为onCreate()更改的提供选项.

所以选项要么卸载完整的应用程序(并使用数据库),要么在升级版本号(例如删除)旧表并再次调用onCreate()之后再次调用onCreate.

在任何情况下,如果未调用onCreate(),请检查数据库是否存在两次.否则它不再被调用.