Android SQLite database for quiz game

前端 未结 2 765
一生所求
一生所求 2021-01-16 16:03

I am making a quiz game and I would like to use SQLite database where I will store 300+ questions and randomly choose one of them. I made a research and I know how to create

2条回答
  •  忘掉有多难
    2021-01-16 16:44

    You should copy your DB file from assets folder to your installed application.
    for example:

    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) {
    }}
    

    Using:
    DatabaseOpenHelper dbHelper = new DatabaseOpenHelper(context);
    SQLiteDatabase database = dbHelper.openDataBase();

提交回复
热议问题