升级SQLite DataBase Android

时间:2015-04-19 09:23:07

标签: android sqlite

我需要升级数据库,但是无法让它工作。我已经看了其他问题,并尝试了不同的事情,但没有设法让它工作。有人可以看看代码并帮助我。

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class DataBaseHelper extends SQLiteOpenHelper {


    private static String DB_PATH = "/data/data/com.ribicinc.pogodi/databases/";

    private static String DB_NAME = "baza.db";

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    private static final int DATABASE_VERSION = 2;

    /**
     *
     *
     * @param context
     */
    public DataBaseHelper(Context context) {

        super(context, DB_NAME, null, 2);
//        if(android.os.Build.VERSION.SDK_INT >= 4.2){
  //          DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
  //      } else {
   //         DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
   //     }
        this.myContext = context;
    }

    /**
     *
     * */
    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if(dbExist){

        }else{

            this.getReadableDatabase();

            try {

                copyDataBase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    /**
     *
     * @return
     */
    private boolean checkDataBase(){

        SQLiteDatabase checkDB = null;

        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){

            //database does't exist yet.

        }

        if(checkDB != null){

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }


    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(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);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public void openDataBase() throws SQLException {

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

        if(myDataBase != null)
            myDataBase.close();

        super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS vprasanja");
        onCreate(db);
    }


}

更新

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.util.Log;


public class DataBaseHelper extends SQLiteOpenHelper {


    private static String DB_PATH = "/data/data/com.ribicinc.pogodi/databases/";

    private static String DB_NAME = "baza.db";

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    private static final String TAG = "MyActivity";

    private static final int DATABASE_VERSION = 8;

    /**
     *
     *
     * @param context
     */
    public DataBaseHelper(Context context) {

        super(context, DB_NAME, null, DATABASE_VERSION);
//        if(android.os.Build.VERSION.SDK_INT >= 4.2){
  //          DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
  //      } else {
   //         DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
   //     }
        this.myContext = context;
    }

    /**
     *
     * */
    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if(dbExist){

        }else{

            this.getReadableDatabase();

            try {

                copyDataBase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    /**
     *
     * @return
     */
    private boolean checkDataBase(){

        SQLiteDatabase checkDB = null;

        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){

            //database does't exist yet.

        }

        if(checkDB != null){

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }


    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(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);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public void openDataBase() throws SQLException {

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

        if(myDataBase != null)
            myDataBase.close();

        super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //db.execSQL("CREATE TABLE vprasanja");
        //db.execSQL("create table TEXT not null");

         String sql = "CREATE TABLE dummy (" +
                 "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                 "name TEXT, " +
                 "disc TEXT, " +
                 "photo TEXT, " +
                 "prep TEXT, " +
                 "thumb TEXT, " +
                 "ingre TEXT, " +
                 "howto TEXT, " +
                 "info TEXT, " +
                 "snackId INTEGER)";
         db.execSQL(sql);


    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //if (oldVersion == 1 && newVersion == 2){
        //  Log.d(TAG, String.format("Upgrade DB:(%d -> %d)", oldVersion, newVersion));
        //}

        //switch(newVersion) {
       // default:
         //       throw new IllegalStateException("onUpgrade() with unknown newVersion" + newVersion);
        //}
        db.execSQL("DROP TABLE IF EXISTS vprasanja");
        onCreate(db);
    }


}

2 个答案:

答案 0 :(得分:0)

为了使onUpgrade()方法工作,您需要在每次升级时增加DATABASE_VERSION个数字。例如:

private static final int DATABASE_VERSION = 3; private static final int DATABASE_VERSION = 4; private static final int DATABASE_VERSION = 5; ...

并替换它:

    super(context, DB_NAME, null, 2);

用这个:

    super(context, DB_NAME, null, DATABASE_VERSION );

以便您的数据库了解升级。

<强>更新

onCreate(db)似乎没有任何代码。确保添加一个负责创建数据库的代码。

答案 1 :(得分:0)

您正在呼叫onCreate(db),但您的onCreate()方法为空。请务必致电super.onCreate(db)并使用db.execSQL()执行创建声明:

@Override
public void onCreate(SQLiteDatabase db) {
    super.onCreate(db);
    db.execSQL(CREATE_STATEMENT);
}