我正在尝试在数据库中创建一个带有一些预插入行的应用程序供用户使用。我在这里看到了很多关于同一主题的不同问题,但我仍然有些困惑。
目前我有一个DB类,它包含所有表创建和与不同表交互的函数。根据我对阅读有关预填充数据的最佳方法的理解是在assets文件夹中创建一个文件并调用它来插入数据。
根据以下答案的帮助,我取得了一些进展,我没有遇到无法访问res文件夹或甚至原始文件夹中的sql文件的错误。我在下面添加了该类的片段,我正在创建我的表,然后尝试使用runScript
方法调用sql文件。我还添加了res和raw的目录布局。
方法
public void runScript(SQLiteDatabase db, int rawResourceId, boolean okToFail)
{
Log.i("DB", "Running SQL script");
InputStream in = context.getResources().openRawResource(rawResourceId);
Scanner s = new Scanner(in);
String sql = "";
while (s.hasNext())
{
sql += " " + s.nextLine();
if (sql.endsWith(";"))
{
try
{
db.execSQL(sql);
}
catch (SQLException e)
{
if (okToFail)
Log.w(getClass().getSimpleName(), e.getMessage());
else
throw e;
}
sql = "";
}
}
s.close();
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(CREATE_TABLE_RECIPES);
db.execSQL(CREATE_TABLE_INGREDIENTS);
db.execSQL(CREATE_TABLE_CONTENTS);
db.execSQL(CREATE_TABLE_SHOPPING);
db.execSQL(CREATE_TABLE_DIRECTIONS);
db.execSQL(CREATE_TABLE_FOOD_CATEGORY);
db.execSQL(CREATE_TABLE_FOOD_LIST);
db.execSQL(CREATE_TABLE_BARCODE);
db.execSQL(CREATE_TABLE_FAVOURITES);
runScript(db, R.raw.pocket_chef_db.sql); ------Cannot resolve symbol raw
//runScript(db, R.res.database.pocket_chef_db.sql) ------Cannot resolve symbol res
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
}
Res - sql的路径
Res->database->pocket_chef_db.sql
Raw - sql的路径
Raw->pocket_chef_db.sql
答案 0 :(得分:1)
我这样做的方法是创建一个.sql文件并将其放在res / raw文件夹中。
此脚本包含rtc-everywhere
语句以删除所有现有表,然后执行所有DROP IF EXISTS
语句。如果您当然可以添加CREATE TABLE
语句。
要运行此脚本,我在SQLOpenLiteHelper扩展类中编写了以下方法。如果您的文件名为db_create.sql,则rawResourceId将为INSERT
。
R.raw.db_create
答案 1 :(得分:0)
尝试使用此链接https://github.com/jgilfelt/android-sqlite-asset-helper中的SqliteAssetHelper来实现您的要求。