资产文件夹中的Android外部数据库无法访问db文件

时间:2015-06-17 04:21:24

标签: android database

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

现在真正的设备出现了问题。显然它没有DataBase打开。我试图将DataBase放在assets文件夹中,但我没有用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;
}

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

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

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

资产文件夹是APK

的一部分

从资产文件夹中读取文件

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

假设您将该文件放在资产文件夹

您可以使用

获取内部存储位置
context.getFilesDir()

请参阅内部存储器Android create folders in Internal Memory

中的创建文件

答案 1 :(得分:0)

您无法向APK写任何内容。因此,您的数据库位于assert文件夹中,该文件夹只能用于读取目的。

在对其进行部分编写之前,需要将该db文件迁移到外部或内部存储器(根据要求)。