Android 应用重启后,SQLiteDatabase 数据库为空。

3

有人可以告诉我如何使我的数据库在重新启动应用程序后不为空吗:

现在,当我重新启动它时,它是空的。但我需要保存插入的数据。

我已经尝试过询问这个问题了,但没有人告诉我我的错误。

这是我的代码:

public class DataBaseFactory   {

private SQLiteDatabase db;
private final Context context;
private SD_util sdUtil;
private static String DB_NAME = "nyam_db.db3";
private static String DB_PATH = "/data/data/com.st.nyam/databases/";
private static String TAG = "DataBaseFactory";
private static int DATABASE_VERSION = 1;
// private final String INSERT_RECEPY =
// "INSERT into RECEPIES ('id', 'recepy', 'author') VALUES (?, ?, ?)";

private final String SELECT_RECIPES = "SELECT * FROM recipes";
private final String SELECT_RECIPE_BY_ID = "SELECT * FROM recipes WHERE ID = ?";
private final String SELECT_COUNT_RECIPE_BY_ID = "SELECT count(*) FROM recipes WHERE ID = ?";
private final String SELECT_STEPS = "SELECT * FROM steps";
private final String SELECT_TABLES = "SELECT name FROM sqlite_master WHERE type= 'table' ORDER BY name";
private final String SELECT_STEPS_BY_ID = "SELECT * FROM steps where recipe_id = ?";
private final String INSERT_STEP = "INSERT INTO steps ('id', 'recipe_id', 'body', 'photo_file_name') VALUES (?,?,?,?) ";
private final String INSERT_RECIPE = "INSERT INTO recipes ('id', 'title', 'description', 'user_id', 'favorites_by', 'main_photo_file_name') VALUES (?,?,?,?,?,?) ";
private final String DELETE_RECIPE = "DELETE FROM recipes WHERE id = ?";
private final String DELETE_STEPS_BY_RECIPEID = "DELETE FROM steps WHERE recipe_id = ?";


public DataBaseFactory(Context ctx) {
    context = ctx;
    sdUtil = new SD_util();
    SQLiteDatabase temp_db = ctx.openOrCreateDatabase(DB_NAME,
            Context.MODE_PRIVATE, null);
    temp_db.close();
    try {
        Log.i(TAG, "Copy intenting");
        copyDataBase();
    } catch (IOException e) {
        Log.e(TAG, e.getMessage());
    }
    Log.i(TAG, "Temp created");
    if (db == null) {
        db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null,
                SQLiteDatabase.OPEN_READWRITE);
    }
    Log.i(TAG, "Temp opened");
}

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        // database does't exist yet.
        e.printStackTrace();
    }
    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

public void openDataBase() throws SQLException {
    // Open the database
    String myPath = DB_PATH + DB_NAME;
    db = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READONLY);
}

private void copyDataBase() throws IOException {
    // Open your local db as the input stream
    InputStream myInput = context.getAssets().open("db/" + DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }
    Log.i(TAG, "Copy data");
    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

public ArrayList<RecipeGeneral> getRecipes() {
    ArrayList<RecipeGeneral> recipes = new ArrayList<RecipeGeneral>();
    Cursor c = db.rawQuery(SELECT_RECIPES, null);
    Log.d(TAG, "getRecipes()");
    if (c != null && c.getCount() > 0) {
        c.moveToFirst();
        do {
            Log.d(TAG, "Getting recipe");
            RecipeGeneral recipe = ModelUtil.getRecipeFromCursor(c);
            recipes.add(recipe);
            Log.d(TAG, "Getting recipe added");
        } while (c.moveToNext());

    }
    c.close();
    return recipes;
}

public ArrayList<Step> getStepsByRecipeId(int recipeId)
        throws ParseException {
    Log.d(TAG, "In getStepsByRecipe");
    ArrayList<Step> steps = new ArrayList<Step>();
    Cursor c = db.rawQuery(SELECT_STEPS_BY_ID,
            new String[] { Integer.toString(recipeId) });
    Log.d(TAG, "Get Query getStepsByRecipe");
    try {
        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            do {
                Log.d(TAG, "Getting step getStepsByRecipe");
                Step step = ModelUtil.getStepFromCursor(c);
                steps.add(step);
                Log.d(TAG, "Getting step added getStepsByRecipe");
            } while (c.moveToNext());
        }
    } finally {
        if (c != null) {
            c.close();
        }
    }
    c.close();
    return steps;

}

/*
 * public ArrayList<Step> getSteps() throws ParseException { ArrayList<Step>
 * steps = new ArrayList<Step>(); Cursor c = db.rawQuery(SELECT_STEPS,
 * null); if (c != null && c.getCount() > 0) { c.moveToFirst(); do { Step
 * step = new Step(); step.setId(c.getInt(c.getColumnIndex("id")));
 * step.setRecipe_id(c.getInt(c.getColumnIndex("recipe_id")));
 * step.setBody(c.getString(c.getColumnIndex("body")));
 * step.setPhoto_file_name
 * (c.getString(c.getColumnIndex("photo_file_name")));
 * step.setPhoto_content_type
 * (c.getString(c.getColumnIndex("photo_content_type")));
 * step.setPhoto_file_size(c.getInt(c.getColumnIndex("photo_file_size")));
 * step.setPhoto_updated_at(new
 * SimpleDateFormat("yyyy.MM.dd G HH:mm:ss").parse
 * (c.getString(c.getColumnIndex("photo_updated_at"))));
 * step.setCreated_at(new
 * SimpleDateFormat("yyyy.MM.dd G HH:mm:ss").parse(c.getString
 * (c.getColumnIndex("created_at")))); step.setUpdated_at(new
 * SimpleDateFormat
 * ("yyyy.MM.dd G HH:mm:ss").parse(c.getString(c.getColumnIndex
 * ("updated_at"))));
 * step.setPhoto_processing(c.getInt(c.getColumnIndex("photo_processing")));
 * steps.add(step); } while (c.moveToNext()); } c.close(); return steps; }
 */

public ArrayList<Recipe> fetchRecipesByQuery(String query)
        throws ParseException {
    ArrayList<Recipe> recipes = new ArrayList<Recipe>();
    Cursor c = db.query(true, "virt", null, "description " + " Match "
            + "'*" + query + "*'", null, null, null, null, null);
    try {
        Log.i(TAG, "Get Query");
        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            do {
                Log.i(TAG, "Getting recipe");
                // Recipe recipe = ModelUtil.getRecipeFromCursor(c);
                // recipes.add(recipe);
                Log.i(TAG, "Getting recipe added");
            } while (c.moveToNext());
        }
    } finally {
        if (c != null) {
            c.close();
        }
    }
    return recipes;
}

public void addRecipeToFavorites(Recipe recipe, Bitmap bitmap) {
    Log.d(TAG, "addRecipeToFavorites begin");
    if (!isRecipeExists(recipe.getId())) {
        ArrayList<Step> steps = recipe.getSteps();
        Log.d(TAG, "Adding  recipe to favorites addRecipeToFavorites()");
        sdUtil.saveRecipeImage(bitmap, recipe.getImg_url());
        db.execSQL(
                INSERT_RECIPE,
                new String[] { Integer.toString(recipe.getId()),
                        recipe.getTitle(), recipe.getDescription(),
                        recipe.getUser(),
                        Integer.toString(recipe.getFavorites_by()),
                        recipe.getImg_url() });
        if (recipe.getSteps() != null) {
            for (Step step : steps) {
                Object[] params = new Object[] { step.getImg_url() };
                new DownloadImageStep().execute(params);
                Log.d(TAG, "Adding step to favorites addRecipeToFavorites()");
                addStepToFavorites(step, recipe.getId());
            }
        } else {
            Log.d(TAG, "No steps in this recipe");
        }
    } else {
        Log.d(TAG, "Recipe already added");
    }
}



private void addStepToFavorites(Step step, int recipe_id) {
    db.execSQL(
            INSERT_STEP,
            new String[] { Integer.toString(step.getNumber()),
                    Integer.toString(recipe_id), step.getInstruction(),
                    step.getImg_url(), });

}

public void deleteRecipeFromFavorites(Recipe recipe) {
    Log.d(TAG, "deleteRecipeFromFavorites begin");
    if (isRecipeExists(recipe.getId())) {
        if (recipe.getSteps() != null) {
            for (Step step : recipe.getSteps()) {
                Log.d(TAG, "Boolean stepimage deleted = " + sdUtil.deleteImageFromSD(step.getImg_url().replace('/', '&')));
            }
            deleteStepsFromFavoritesByRecipeId(recipe.getId());
        } else {
            Log.d(TAG, "No steps in this recipe");
        }
        Log.d(TAG, "Image name in database = " + recipe.getImg_url().replace('/', '&'));
        Log.d(TAG, "Boolean recipeimage deleted = " + sdUtil.deleteImageFromSD(recipe.getImg_url().replace('/', '&')));
        Log.d(TAG, "Deleted rows: " + db.delete("recipes", "id=?", new String[] {Integer.toString(recipe.getId())}));
    } else {
        Log.d(TAG, "Recipe doesn`t exist");
    }
}

private void deleteStepsFromFavoritesByRecipeId(int recipeId) {
    Log.d(TAG, "deleteStepsFromFavoritesByRecipeId begin");
    db.delete("steps", "recipe_id=?", new String[] { Integer.toString(recipeId)});

}
/*
 * public void putRecepy(Recepy recepy) { db.execSQL(INSERT_RECEPY, new
 * String[] {Integer.toString(recepy.getId()), recepy.getRecepy(),
 * recepy.getAuthor()}); }
 */
public boolean isRecipeExists(int id) {
    Cursor c = db.rawQuery(SELECT_RECIPE_BY_ID,
            new String[] { Integer.toString(id) });
    try {
        Log.d(TAG, "isRecipeExists before c.movetoFirst()");
        if (c.moveToFirst()) {
            if (c != null && c.getCount() > 0) {
                Log.d(TAG, "Checking passed");
                //Recipe recipe = ModelUtil.getRecipeFromCursor(c);
                //Log.d(TAG, "RECIPEExists: " + recipe.toString());
                return true;
            }
        }
    } finally {
        if (c != null) {
            c.close();
        }
    }
    return false;
}

private class DownloadImageStep extends AsyncTask<Object, Void, Object> {

    @Override
    protected Object doInBackground(Object... o) {
        Bitmap outBitmap = null;
        try {
            sdUtil.saveStepImage((String) o[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return outBitmap;
    }
}

更新: 我发现我的错误在于构造函数中。我不需要创建temp_db并调用copyData();


5
你真的需要研究一下如何使用 SQLiteOpenHelper - Jens
1
因为你的代码难以阅读!请查看此链接http://www.vogella.com/articles/AndroidSQLite/article.html,重写你的代码。 - hovanessyan
重启应用后,您会得到放置在“assets”文件夹中的相同数据库吗?您如何使用DataBaseFactory类(如何获取对数据库的引用,以便调用添加、删除食谱等方法)? - user
你能为你的问题创建一个单独的答案并接受它吗?这样,这个问题就不会出现在未回答的问题中了。 - Yury
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

我找到了我的错误。它在构造函数中。我不需要创建temp_db并调用copyData();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,