在启动应用程序时,如果数据库不存在,我需要创建一个db,并将一些初始数据存储到其中。我怎么能这么做?
我知道我应该使用SQLiteOpenHelper
类,但是还没有找到一个示例,如果它不存在,它就会创建一个锐钛矿型,并使用初始数据引导它。
发布于 2015-10-27 21:39:26
还没有找到一个示例,如果不存在,它就会创建一个锐钛矿,并使用初始数据引导它。
您看到的关于SQLiteOpenHelper
的每个示例都会创建一个数据库,如果它不存在的话。这是拥有SQLiteOpenHelper
的一半意义(另一半是在模式需要更改时协助数据库迁移)。实际的数据库创建本身由SQLiteOpenHelper
处理。您只需要覆盖onCreate()
并创建您的模式(如果相关,还需要用初学者数据填充表)。
例如,在这个示例应用程序中,我有一个SQLiteOpenHelper
子类,它就是这样做的:
/***
Copyright (c) 2008-2012 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
https://commonsware.com/Android
*/
package com.commonsware.android.constants;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.hardware.SensorManager;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME="constants.db";
private static final int SCHEMA=1;
static final String TITLE="title";
static final String VALUE="value";
static final String TABLE="constants";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE constants (title TEXT, value REAL);");
ContentValues cv=new ContentValues();
cv.put(TITLE, "Gravity, Death Star I");
cv.put(VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Earth");
cv.put(VALUE, SensorManager.GRAVITY_EARTH);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Jupiter");
cv.put(VALUE, SensorManager.GRAVITY_JUPITER);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Mars");
cv.put(VALUE, SensorManager.GRAVITY_MARS);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Mercury");
cv.put(VALUE, SensorManager.GRAVITY_MERCURY);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Moon");
cv.put(VALUE, SensorManager.GRAVITY_MOON);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Neptune");
cv.put(VALUE, SensorManager.GRAVITY_NEPTUNE);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Pluto");
cv.put(VALUE, SensorManager.GRAVITY_PLUTO);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Saturn");
cv.put(VALUE, SensorManager.GRAVITY_SATURN);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Sun");
cv.put(VALUE, SensorManager.GRAVITY_SUN);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, The Island");
cv.put(VALUE, SensorManager.GRAVITY_THE_ISLAND);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Uranus");
cv.put(VALUE, SensorManager.GRAVITY_URANUS);
db.insert(TABLE, TITLE, cv);
cv.put(TITLE, "Gravity, Venus");
cv.put(VALUE, SensorManager.GRAVITY_VENUS);
db.insert(TABLE, TITLE, cv);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
throw new RuntimeException("How did we get here?");
}
}
发布于 2015-10-27 21:38:57
我会这样做的:
在下一个应用程序运行中,由于标志将出现,初始化函数将被跳过。
您可以将App类看作是在每个活动之前启动的东西。它不是一个项目所需的类,但是要进行这种初始化,它是放置它们的正确位置。
https://stackoverflow.com/questions/33378816
复制相似问题