Android没有写入数据库中的表 - 直到

时间:2014-04-30 07:03:28

标签: java android sqlite android-sqlite

我最近在SQLiteDatabaseSQLiteOpenHelper课上练习了很多,有些东西让我感到很困惑。

我有constructoronCreate()方法:

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

@Override
    public void onCreate(SQLiteDatabase db) {
        String create_table = "CREATE TABLE " + MEASUREMENT_TYPE_TABLE +
                "(" + idCol + " integer primary key autoincrement, " +
                typeCol + " varchar(255) not null) ";

        db.execSQL(create_table);

        populateMeasurementTable();

}

最后调用的方法如下:

public void populateMeasurementTable() {
        SQLiteDatabase db = this.getWritableDatabase();
        for(int i = 0; i < measurementType.length; i++) {
            ContentValues values = new ContentValues();
            values.put(typeCol, measurementType[i]);
            db.insert(MEASUREMENT_TYPE_TABLE, null, values);
        }
}

方法的要点是填充在onCreate()方法中创建的表。但是当我在IntelliJ中转到tools -> Android -> Monitor (DDMS included)并查看数据库文件时,它不包含表或任何数据(当然)。

measurementType只是一个正在迭代的数组:

private static final String[] measurementType = new String[] {"acceleration", "angles", "area", "astronomical",
            "density", "energy", "force", "frequency", "length/distance", "power", "pressure", "speed",
            "temperature", "torque", "volume", "weight"};

我尝试将引用传递给数据库,如下所示:

populateMeasurementTable(db);

并在方法中删除此语句:

db = this.getWriteableDatabse();

我很确定它会抱怨已经打开连接。但它仍然没有填充创建表或填充它。

活动中的onCreate()方法是:

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

        DataBaseHandler handler = new DataBaseHandler(getApplicationContext());
}

没什么特别的,只是实例化处理程序类。我的理解是,此时将调用onCreate()方法,并且一切都会贯彻。

请注意,我没有获得任何类型的SQLExceptionserrors

所以我在活动的onCreate()方法中尝试了这个:

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

        DataBaseHandler handler = new DataBaseHandler(getApplicationContext());
        handler.populateMeasurementTable();
}

我在SQLite浏览器中打开了数据库文件,不仅表格在那里,而且数据也在那里......

所以我想我的问题有三个方面:

  • 仅仅实例化数据库处理程序还不足以调用其onCreate()方法吗?因为这就是为什么不创建表以及没有插入数据的原因?
  • 如果实例化足以调用该方法,那么为什么不创建表并用数据填充它。

目前我猜第一个问题有答案(如果有意义的话)

  • 最后针对第三个问题,有没有一种方法可以简单地实例化它并让它运行初始化方法?因为populate方法是众多中的第一个,我不想在活动中调用它们,所以感觉不适合进入。

1 个答案:

答案 0 :(得分:0)

  

仅仅实例化数据库处理程序还不足以调用其onCreate方法吗?因为这就是为什么没有创建表以及没有插入数据的原因?

是的,除了创建助手之外,请致电getWritableDatabase()。如果数据库文件不存在,则调用onCreate()回调。

getWritableDatabase()中调用onCreate()或从中调用的方法存在错误。你会得到一个关于递归调用的例外。将db参数传递给onCreate(),以防您需要使用其他方法处理数据库。

另请参阅:When is SQLiteOpenHelper onCreate() / onUpgrade() run?

  

如果实例化足以调用该方法,那么为什么不创建表并用数据填充它。

这还不够。

  

最后针对第三个问题,有没有一种方法可以简单地实例化它并让它运行初始化方法?因为populate方法是众多中的第一个,我不想在活动中调用它们,所以感觉不适合进入。

将数据库填充在数据库助手onCreate()中。