【问题标题】:Android external database in assets folder not acces to db file资产文件夹中的 Android 外部数据库无法访问 db 文件
【发布时间】:2015-06-17 04:21:24
【问题描述】:

我有一个 android 应用程序,它应该读取和扩展已在 SQLite 上创建的 DataBase...通过将数据库放在模拟器的 file explorer 上的 data/data/(packagename)/database 文件夹中,它可以在模拟器上正常工作.

现在真机出现问题。显然它没有要打开的数据库。我试图将数据库放在资产文件夹中,但我无法使用 openhelper 打开它。如何访问我的数据库文件表单资产文件夹。请给我正确的解决方案,因为我是 Android 和 java 的新手。

这是我的 dbheperclass 。

public class FoodDbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "pkfood_calories.DB";
private static final int DATABASE_VERSION = 1;
private static final String CREATE_QUERY =
        "CREATE TABLE "+ Food.NewDishInfo.TABLE_NAME+"("
                + Food.NewDishInfo.DISH_NAME+" TEXT NOT NULL,"
                + Food.NewDishInfo.DISH_QUANTITY+" TEXT NOT NULL,"
                + Food.NewDishInfo.DISH_CALORIE+" INTEGER,"
                + Food.NewDishInfo.DISH_FAT+" TEXT NOT NULL,"
                + Food.NewDishInfo.DISH_PROTEIN+" TEXT NOT NULL,"
                + Food.NewDishInfo.DISH_SUGAR+" TEXT NOT NULL,"
                + Food.NewDishInfo.DISH_VITAMINS+" TEXT NOT NULL);";
public FoodDbHelper(Context context)
{
    super(context,DATABASE_NAME,null,DATABASE_VERSION);
    Log.e("DATABASE OPERATION","Database created / opened...");
}
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_QUERY);
    Log.e("DATABASE OPERATION","Table created...");


}
public void addInformations(String name ,String quantity, Integer calorie, String fat ,
                            String protein,String sugar,String vitamins, SQLiteDatabase db){


    ContentValues contentValues = new ContentValues();
    contentValues.put(Food.NewDishInfo.DISH_NAME,name);
    contentValues.put(Food.NewDishInfo.DISH_QUANTITY,quantity);
    contentValues.put(Food.NewDishInfo.DISH_CALORIE,calorie);
    contentValues.put(Food.NewDishInfo.DISH_FAT,fat);
    contentValues.put(Food.NewDishInfo.DISH_PROTEIN,protein);
    contentValues.put(Food.NewDishInfo.DISH_SUGAR,sugar);
    contentValues.put(Food.NewDishInfo.DISH_VITAMINS,vitamins);

    db.insert(Food.NewDishInfo.TABLE_NAME, null, contentValues);
    Log.e("DATABASE OPERATION","one row inserted...");
}
public Cursor getInformations(SQLiteDatabase db){
    Cursor cursor;
    String[] projections = {Food.NewDishInfo.DISH_NAME,Food.NewDishInfo.DISH_QUANTITY,
            Food.NewDishInfo.DISH_CALORIE,Food.NewDishInfo.DISH_FAT,Food.NewDishInfo.DISH_PROTEIN,
            Food.NewDishInfo.DISH_SUGAR, Food.NewDishInfo.DISH_VITAMINS};
    cursor= db.query(Food.NewDishInfo.TABLE_NAME,projections,null,null,null,null,"DISH_NAME ASC");
    return cursor;
}

请帮我解决这个问题..

【问题讨论】:

标签: android database


【解决方案1】:

首先你从资产文件夹中读取的逻辑是正确的。

但写入资产文件夹可能不是更好的逻辑。

资产文件夹是 APK 的一部分

从资产文件夹中读取文件

context.getAssets().open("pkfood_calories.DB")

假设您将该文件放在 assets 文件夹中

您可以使用获取内部存储器位置

context.getFilesDir()

参考在内存中创建文件Android create folders in Internal Memory

【讨论】:

    【解决方案2】:

    您不能向APK 写入任何内容。因此,您的数据库位于断言文件夹中,只能用于阅读目的。

    在对其进行一些写入之前,您需要将该数据库文件迁移到外部或内部存储器中(根据要求)。

    【讨论】:

    • 你说的外存是什么意思?
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 2013-07-14
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2013-08-21
    • 2017-12-11
    相关资源
    最近更新 更多