Я пытаюсь создать приложение, которое поставляется с некоторыми предварительно вставленными строками в базе данных для пользователя. Я рассмотрел множество разных вопросов здесь, относящихся к одной и той же теме, но я все еще немного смущен.База данных Android SQLite с вставленной строкой
В настоящее время у меня есть класс DB, который содержит всю таблицу создает и функции, которые взаимодействуют с различными таблицами. Из моего понимания чтения наилучшим способом, чтобы предварительно заполненные данные создавали файл в папке с ресурсами и вызывали его для вставки данных.
В соответствии с приведенными ниже ответами я достиг некоторого прогресса, я не сталкиваюсь с ошибкой отсутствия доступа к sql-файлу в папке res или даже в необработанной папке. Я добавил ниже фрагмента из класса, я создавал свои таблицы, а затем пытался вызвать sql-файл, используя метод runScript
. Я также добавил макет каталога как 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
Большое спасибо за ответ, это похоже на то, что мне нужно. Однако у меня проблема с передачей файла базы данных. У меня есть файл, расположенный в assets-> databases-> chef_db.sql, поэтому я пытаюсь вызвать функцию, используя 'runScript (db, R.assets.databases.pocket_chef_db.sql);' но это бросает ошибку для активов – JJSmith
Да, поместите его в res/raw вместо – wvdz
Оба 'R.raw.databases.pocket_chef_db.sql' и' R.res.databases.pocket_chef_db.sql' дают ту же ошибку – JJSmith