4

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

  1. 如果我的 base 大于 1 MB,就会弹出错误 D / assets (909): Data超过 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 设备。

以下报价代码

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;
}
}
4

2 回答 2

8

不需要这个凌乱的代码,这对你来说是一个很好的解决方案Android SQLiteAssetHelper

于 2012-12-20T17:16:32.643 回答
0

我认为问题在于您只需要将图像存储在移动应用程序中,但如果它的大小非常大,请从服务器中检索它,感谢@confucius 对本文的帮助,它确实有帮助,这是另一个分步教程,它解释了如何使用sqlite浏览器在android中制作一个预加载的数据库

于 2015-08-05T08:31:15.920 回答