如何正确使用Android中预装的数据库

时间:2012-12-20 17:01:45

标签: android android-sqlite

我想使用预加载的数据库。数据库必须附在应用程序中,然后才能更新。我对如何连接以避免问题有很多疑问。我问那些处理问题的专业人士。谢谢。

  1. 如果我的基数大于1 MB,则会弹出错误D / asset(909):数据超过UNCOMPRESS_DATA_MAX。可以分解为小于1兆字节的片段,并且可以更改为增加(“。jpg”,“。Jpeg”,“。Png”,“。Gif”,“。wav”,“。mp2”,“。 mp3“,”。ogg“,”。aac“,”。mpg“,”。mpeg“,”。mid“,”。midi“,”。smf“,”。jet“,”。rtttl“,”。 imy“,”。xmf“,”。mp4“,”。m4a“,”。m4v“,”。3 gp“,”。3 gpp“,”。3 g2“,”。3 gpp2“,”。amr “,”。awb“,”。wma“,”。wmv“)。哪个选项更好(更容易 - 更改扩展名)。

  2. 可能会失败“没有这样的表android_metadata”但是我手动添加到数据库en_US,但是如果应用程序多语言呢?

  3. 在读取数据库时,我使用的方法是mDb = getReadableDatabase();,但是我正处于近距离阅读的末尾 - mDb.close();正如他们在互联网上所说,可能无关心任何错误无法打开数据库文件。这尤其适用于HTC设备。

  4. 以下引用代码

    public class QuestionsDbAdapter extends SQLiteOpenHelper {
    
    private String DATABASE_PATH = "/data/data/YOUR_PACKAGE/";
    public static final String DATABASE_NAME = "mantestQuestions";
    
    public static final String TABLE_QUESTIONS = "Questions";
    public static final String QUESTIONS_COLUMN_ID = "_id";
    public static final String QUESTIONS_COLUMN_QUESTION ="Question";
    
    public static final String TABLE_ANSWERS = "Answers";
    public static final String ANSWERS_COLUMN_ID = "_id";
    public static final String ANSWERS_COLUMN_QUESTION_ID = "QuestionId";
    public static final String ANSWERS_COLUMN_ANSWER = "Answer";
    public static final String ANSWERS_COLUMN_POINT = "Point";
    
    private SQLiteDatabase mDb;
    
    private final Context mContext;
    
    private boolean mCreateDatabase = false;
    private boolean mUpgradeDatabase = false;
    
    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access
     * the application's assets and resources
     * @param context
     */
    public QuestionsDbAdapter(Context context) {
        super(context, DATABASE_NAME, null, context.getResources().getInteger(R.integer.questionDbVersion));
    
        mContext = context;
    }
    
    public void initializeDatabase(String path) {
        DATABASE_PATH = path;
        getWritableDatabase();
    
        if(mUpgradeDatabase) {
            mContext.deleteDatabase(DATABASE_NAME);
        }
    
        if(mCreateDatabase || mUpgradeDatabase) {
            try {
                copyDatabase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }
    
    private void copyDatabase() throws IOException {
        close();
    
        InputStream input = mContext.getAssets().open(DATABASE_NAME);
    
        String outFileName = DATABASE_PATH + DATABASE_NAME;
    
        OutputStream output = new FileOutputStream(outFileName);
    
        // Transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
    
        output.flush();
        output.close();
        input.close();
    
        getWritableDatabase().close();
    }
    
    public QuestionsDbAdapter open() throws SQLException {
        mDb = getReadableDatabase();
        return this;
    }
    
    public void CleanUp() {
        mDb.close();
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        mCreateDatabase = true;
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        mUpgradeDatabase = true;
    }
    
    /**
     * Public helper methods
     */
    
    public Cursor getQuestionById(long rowId) throws SQLException {
        Cursor cursor = mDb.query(true, TABLE_QUESTIONS,
                new String[] { QUESTIONS_COLUMN_ID, QUESTIONS_COLUMN_QUESTION }, QUESTIONS_COLUMN_ID + "=" + rowId,
                null, null, null, null, null);
    
        return cursor;
    }
    
    public Cursor getAnswerById(long rowId) throws SQLException {
        Cursor cursor = mDb.query(true, TABLE_ANSWERS,
                new String[] { ANSWERS_COLUMN_ID, ANSWERS_COLUMN_QUESTION_ID, ANSWERS_COLUMN_ANSWER, ANSWERS_COLUMN_POINT },
                ANSWERS_COLUMN_ID + "=" + rowId,
                null, null, null, null, null);
    
        return cursor;
    }
    
    public Cursor getAnswersByQuestionId(long questionId) throws SQLException {
        Cursor cursor = mDb.query(true, TABLE_ANSWERS, new String[] {ANSWERS_COLUMN_ANSWER, ANSWERS_COLUMN_POINT},
                ANSWERS_COLUMN_QUESTION_ID + "=" + questionId, null, null, null, null, null);
    
        return cursor;
    }
    
    public long getCount() {
        String sql = "SELECT COUNT(*) FROM " + TABLE_QUESTIONS;
        SQLiteStatement statement = mDb.compileStatement(sql);
        long count = statement.simpleQueryForLong();
        return count;
    }
    }
    

2 个答案:

答案 0 :(得分:8)

这里不需要这个混乱的代码是你Android SQLiteAssetHelper

的好方法

答案 1 :(得分:0)

我认为问题是你只需要将你的图像存储在移动应用程序中,但如果它的大小非常大,那么从服务器检索它,感谢@confucius对于这篇文章它确实有帮助,这里是另一个循序渐进的教程这解释了how to use sqlite browser to make a pre-loaded database in android