2016-10-19 55 views
0

我是新来的Android SQLite。我无法从资产文件夹升级数据库android

我在我的资产文件夹中有aowdb.db。

为什么问?因为当我调试我的应用程序时,每次更新db文件时,我都需要从设备上卸载应用程序才能强制更新。当用户从Play商店更新我的应用程序时,用户是否也需要这样做?我很害怕。

这是我的代码:

DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper { 

    public static final String DBNAME = "aowdb.db"; 
    public static final int DBVERSION = 2; 
    public static final String DBLOCATION = "/data/data/com.exercises.example/databases/"; 
    public static final String TABLE_EXERCICE = "EXERCISE"; 

    // Exercise Table Columns names 
    private static final String KEY_ID = "ID"; 
    private static final String KEY_NAME = "NAME"; 
    private static final String KEY_PR_MUSCLE = "PR_MUSCLE"; 
    private static final String KEY_SC_MUSCLE = "SC_MUSCLE"; 

    private Context mContext; 
    private SQLiteDatabase mDatabase; 

    public DatabaseHelper(Context context) { 
     super(context, DBNAME, null, DBVERSION); 
     this.mContext = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

    public void openDatabase() { 
     String dbPath = mContext.getDatabasePath(DBNAME).getPath(); 
     if (mDatabase != null && mDatabase.isOpen()) { 
      return; 
     } 
     mDatabase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    public void closeDatabase() { 
     if (mDatabase != null) { 
      mDatabase.close(); 
     } 
    } 

    public ExerciseInfo getExerciseInfo(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_EXERCICE, new String[]{KEY_ID, 
         KEY_NAME, KEY_PR_MUSCLE, KEY_SC_MUSCLE,}, KEY_ID + "=?", 
       new String[]{String.valueOf(id)}, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     ExerciseInfo exercise = new ExerciseInfo(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3)); 
     return exercise; 
    } 

} 

MainActivity

public class MainActivity extends AppCompatActivity { 

     public DatabaseHelper mDBHelper; 
     ExerciseInfo exerciseInfo; 
    int ex_id = 1; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

    mDBHelper = new DatabaseHelper(this); 
      //Check exists database 
      File database = getApplicationContext().getDatabasePath(DatabaseHelper.DBNAME); 
      if(false == database.exists()) { 
       mDBHelper.getReadableDatabase(); 
       //Copy db 
       if(copyDatabase(this)) { 
        Toast.makeText(this, "Copy database succes", Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(this, "Copy data error", Toast.LENGTH_SHORT).show(); 
        return; 
       } 
      } 

    exerciseInfo = mDBHelper.getExerciseInfo(ex_id); 

     } 
    private boolean copyDatabase(Context context) { 
     try { 

      InputStream inputStream = context.getAssets().open(DatabaseHelper.DBNAME); 
      String outFileName = DatabaseHelper.DBLOCATION + DatabaseHelper.DBNAME; 
      OutputStream outputStream = new FileOutputStream(outFileName); 
      byte[]buff = new byte[1024]; 
      int length = 0; 
      while ((length = inputStream.read(buff)) > 0) { 
       outputStream.write(buff, 0, length); 
      } 
      outputStream.flush(); 
      outputStream.close(); 
      Log.w("MainActivity","DB copied"); 
      return true; 
     }catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

ExerciseInfo.class

public class ExerciseInfo { 
    private int id; 
    private String name; 
    private String pr_muscle; 
    private String sec_muscle; 

    public ExerciseInfo(int id, String name, String pr_muscle, String sec_muscle) { 
     this.id = id; 
     this.name = name; 
     this.pr_muscle = pr_muscle; 
     this.sec_muscle = sec_muscle; 

    } 

    public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getPr_muscle() { 
     return pr_muscle; 
    } 

    public String getSec_muscle() { 
     return sec_muscle; 
    } 
} 
+1

'当用户从Play商店更新我的应用程序时,用户是否需要这样做?'是的,如果每次提供更改的数据库。在资产文件夹中提供数据库仅在您为其提供一些数据时才有用。否则,只需在第一次运行应用程序时在运行时创建它。 –

+0

只需使用[SQLiteAssetHelper](https://github.com/jgilfelt/android-sqlite-asset-helper)。这就是'onUpdate'的用途。 –

+0

每次启动应用程序时,只需盲目地将资产数据库从资产复制到目的地。在访问数据库之前执行此操作。 – greenapps

回答

0

每当有数据库更新时,都不需要卸载应用程序。 只需增加数据库版本并在onUpgrade()方法中创建查询以处理数据库更新更改。

相关问题