2013-07-20 3 views
0

Я делаю викторину, и я хотел бы использовать базу данных SQLite, где я буду хранить более 300 вопросов и случайным образом выбирать один из них. Я провел исследование, и я знаю, как создавать и обновлять таблицу, добавлять, изменять и удалять строки в приложении для Android, но я не смог найти способ подключения моего приложения к уже сделанной базе данных (хранилась база данных только для чтения в папке resources (assets)).База данных Android SQLite для викторины

Не могли бы Вы помочь мне?

+0

Просто идея: не было бы лучше, чтобы разобрать файл (JSON/XML/все ..), когда приложение запускается впервые в приложение ВНУТРЕННЕГО база данных? Ваш файл активов должен быть файлом базы данных? – iBecar

ответ

0

Вы должны скопировать файл базы данных из папки активов в установленном приложении.
, например:

public class DatabaseOpenHelper extends SQLiteOpenHelper { 

private final static String DB_NAME = "YourDatabaseFile.sqlite"; 
private static String DB_PATH = "/data/data/%s/databases/"; 
private final String ERROR_TAG = "error"; 
private final static int DB_VERSION = 1; 
private final int BUFFER_SIZE = 8 * 1024; 
private SQLiteDatabase databaseHandle; 

private final Context context; 

public DatabaseOpenHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 

    this.context = context; 
    DB_PATH = String.format(DB_PATH, context.getPackageName()); 
} 

public SQLiteDatabase openDataBase() { 
    try { 
     String databasePath = DB_PATH + DB_NAME; 
     if (databaseHandle == null) { 
      createDataBase(); 
      databaseHandle = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE); 
     } 
    } 
    catch (SQLiteException e) { 
     throw new IllegalStateException(context.getResources().getString(R.string.err_opening_db), e); 
    } 
    return databaseHandle; 
} 

private boolean createDataBase() { 
    try { 
     if (!isDataBase()) { 
      this.getReadableDatabase(); 
      copyDataBase(); 
      return true; 
     } 
    } 
    catch (SQLiteException e) { 
     throw new IllegalStateException(context.getResources().getString(R.string.err_opening_db), e); 
    } 
    catch (IOException e){ 
     Log.e(ERROR_TAG, context.getResources().getString(R.string.err_close_stream), e); 
    } 

    return false; 
} 

public boolean isDataBase() { 
    SQLiteDatabase verifiableDatabase = null; 
    try { 
     String databasePath = DB_PATH + DB_NAME; 
     verifiableDatabase = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READONLY); 
     verifiableDatabase.close(); 
    } 
    catch (SQLiteException e) { 
     Log.e(ERROR_TAG, context.getResources().getString(R.string.err_opening_db), e); 
     return false; 
    } 

    return true; 
} 

private void copyDataBase() throws IOException { 
    InputStream externalDbStream = null; 
    OutputStream localDbStream = null; 
    try { 
     externalDbStream = context.getAssets().open(DB_NAME); 
     localDbStream = new FileOutputStream(DB_PATH+DB_NAME); 

     byte[] buffer = new byte[BUFFER_SIZE]; 
     int bytesRead; 

     while ((bytesRead = externalDbStream.read(buffer)) > 0) { 
      localDbStream.write(buffer, 0, bytesRead); 
     } 
    } 
    catch (IOException e) { 
     throw new IllegalStateException(context.getResources().getString(R.string.err_copying_db), e); 
    } 
    finally { 
     if (localDbStream != null) 
      localDbStream.close(); 
     if (externalDbStream != null) 
      externalDbStream.close(); 
    } 
} 

@Override 
public void close() { 
    databaseHandle.close(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
}} 

Использование:
DatabaseOpenHelper dbHelper = new DatabaseOpenHelper(context);
SQLiteDatabase database = dbHelper.openDataBase();

0

Это очень сложная вещь, хорошо не очень сложная, но вам нужно сделать кое-что для программирования. Чтобы прочитать базу данных из папки с ресурсами напрямую не представляется возможным, ее необходимо скопировать во внутреннюю память или на SD-карту. Для того, чтобы объяснить это здесь много, пожалуйста, прочтите этот учебник, that's правильный пункт, чтобы начать:

http://zaman91.wordpress.com/2010/09/22/android-how-to-use-own-sqlite-database/

Смежные вопросы