2016-03-11 2 views
0

Я пытаюсь создать приложение, которое поставляется с некоторыми предварительно вставленными строками в базе данных для пользователя. Я рассмотрел множество разных вопросов здесь, относящихся к одной и той же теме, но я все еще немного смущен.База данных 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 

ответ

1

Как я это сделал, создайте файл .sql и поместите его в папку res/raw.

Этот скрипт содержит операторы DROP IF EXISTS, чтобы удалить все существующие таблицы, а затем выполняет все операторы CREATE TABLE. Если вы также можете добавить INSERT.

Для запуска этого скрипта я написал следующий метод в моем классе расширения SQLOpenLiteHelper. Ваш rawResourceId будет R.raw.db_create, если ваш файл называется db_create.sql.

/** 
* Runs the provided raw resource as a script that doesn't return anything. 
* 
* Warning: this is a NOT a foolproof SQL script interpreter. 
* 
* Please note: 
* All terminators (;) must be at the end of a line. 
* 
* 
* @param db 
* @param rawResourceId 
*/ 
public void runScript(SQLiteDatabase db, int rawResourceId, boolean okToFail) 
{ 
    Log.i(getClass().getSimpleName(), "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(); 
} 
+0

Большое спасибо за ответ, это похоже на то, что мне нужно. Однако у меня проблема с передачей файла базы данных. У меня есть файл, расположенный в assets-> databases-> chef_db.sql, поэтому я пытаюсь вызвать функцию, используя 'runScript (db, R.assets.databases.pocket_chef_db.sql);' но это бросает ошибку для активов – JJSmith

+0

Да, поместите его в res/raw вместо – wvdz

+0

Оба 'R.raw.databases.pocket_chef_db.sql' и' R.res.databases.pocket_chef_db.sql' дают ту же ошибку – JJSmith