简体   繁体   English

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

[英]How right use preloaded database in Android

I want to use preloaded database. 我想使用预加载的数据库。 The database must be annexed to the application, and then be able to update. 数据库必须附在应用程序中,然后才能更新。 I have a number of doubts about how to connect it to avoid problems. 我对如何连接以避免问题有很多疑问。 I ask that answered professionals who deal with the problem. 我问那些处理问题的专业人士。 Thank you. 谢谢。

  1. If my base is greater than 1 MB, it pops up an error D / asset (909): Data exceeds UNCOMPRESS_DATA_MAX. 如果我的基数大于1 MB,则会弹出错误D / asset(909):数据超过UNCOMPRESS_DATA_MAX。 Can be broken down into pieces smaller than 1 megabyte, and can be changed to increase (". 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"). 可以分解为小于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“)。 Which option is better (easier - change the extension). 哪个选项更好(更容易 - 更改扩展名)。

  2. Might fail "No such table android_metadata" but I added manually to the database en_US, but what if the application multilanguage? 可能会失败“没有这样的表android_metadata”但我手动添加到数据库en_US,但如果应用程序多语言怎么办?

  3. When reading the database, I use the method mDb = getReadableDatabase ();, but I'm at the end of a close reading - mDb.close (); 在读取数据库时,我使用的方法是mDb = getReadableDatabase();,但是我正在接近阅读的结尾 - mDb.close(); As they say on the Internet may not care any error Unable to open database file. 正如他们在互联网上所说,可能无关心任何错误无法打开数据库文件。 This is especially for the devices HTC. 这尤其适用于HTC设备。

The following quote code 以下引用代码

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

这里不需要这个混乱的代码是Android SQLiteAssetHelper的好方法

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM