2013-08-28 6 views
0

Я хочу проверить базу данных, если она существует или нет. Если этого не было, я скопирую файл по определенному пути. Вот код, как показано ниже:Скопируйте существующий sqlite базы данных и запустите на устройстве - android

Main.java

UserDbAdapter objChatMessageDbAdapter = new UserDbAdapter(); 
    objChatMessageDbAdapter.context = context; 
    User objChatMessage = objChatMessageDbAdapter.getUser(); 

    if(objChatMessage.getID()<1){ 

     //call register intent 
    }else{ 
     // call the first intent 
    } 

UserDbAdapter.java

private SQLiteDatabase db; 
    private static String TABLE_USER = "User"; 
    private boolean isDbClosed =true; 
    public Context context; 
    String TAG = "UserDbAdapter"; 

    public UserDbAdapter() { } 

    public void init(Context context) { 

     if(isDbClosed){ 
     DatabaseAdapter dbAdapter = DatabaseAdapter.getInstance(context); 
     isDbClosed =false; 
     db = dbAdapter.getWritableDatabase(); 
     }  

     this.context = context; 
    } 

    private void processConnection() 
    { 
     Log.i(TAG, "isDbClosed==="+isDbClosed); 
     if(isDbClosed){ 
     DatabaseAdapter dbAdapter = new DatabaseAdapter(context); 
     dbAdapter = DatabaseAdapter.getInstance(context); 
     isDbClosed =false; 
     db = dbAdapter.getWritableDatabase(); 
     Log.i(TAG, "processConnection db===="+db.toString()); 
     }  
    } 

    public boolean isDatabaseClosed(){ 
    return isDbClosed; 
    } 

    public User getUser() 
    { 

      processConnection(); 
      User objChatMessageEntity = new User(); 
      String selectQuery = "Select UserId, Name, Password FROM "+TABLE_USER; 
      Cursor cursor = db.rawQuery(selectQuery, null); 
      // looping through all rows and adding to list 
      if (cursor.moveToFirst()) {        
      objChatMessageEntity = fieldMappingForGetRecord(cursor); 

      } 
      cursor.close(); 
      db.close(); 
      isDbClosed =true; 
      return objChatMessageEntity; 
    } 
} 

DatabaseAdapter.java

private static String dbPath; 
private static String dbName = "ownexpensesdb"; 
private SQLiteDatabase applicationDatabase; 
public final Context applicationContext; 
private static DatabaseAdapter mInstance = null; 
private static final int DATABASE_VERSION = 1; 


public static DatabaseAdapter getInstance(Context ctx) { 

    if (mInstance == null) { 
     dbPath = "/data/data/" + ctx.getPackageName() + "/databases/"; 
     mInstance = new DatabaseAdapter(ctx.getApplicationContext()); 
    } 
    return mInstance; 
} 

public DatabaseAdapter(Context context) {  
    super(context, dbName , null, DATABASE_VERSION); 
    this.applicationContext = context; 

    boolean dbExist = checkDataBase(); 
    //SQLiteDatabase db_Read = null; 
    if (dbExist){ 
     Log.w("Database","file found "); 
     openDataBase(); 
    } 
    else 
    { 
     Log.w("Database","file not found "); 
     this.getReadableDatabase(); 
     try 
     { 
      copyDatabase(); 
     } 
     catch (IOException e) 
     { 
      Log.e("Error",""+e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 


private boolean checkDataBase(){ 
    File dbFile = new File(dbPath + dbName); 
    return dbFile.exists(); 
} 

private void copyDatabase() throws IOException 
{ 
    InputStream input = applicationContext.getAssets().open(dbName); 
    String outPutFileName= dbPath + dbName ; 
    OutputStream output = new FileOutputStream(outPutFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = input.read(buffer))>0){ 
    output.write(buffer, 0, length); 
    } 
    output.flush(); 
    output.close(); 
    input.close(); 
} 


    public void openDataBase() throws SQLException 
    { 
     String fullDbPath= dbPath + dbName; 
     Log.w("Database","open DB"); 
     try 
     { 
      applicationDatabase = SQLiteDatabase.openDatabase(fullDbPath, null,SQLiteDatabase.OPEN_READONLY); 
     } 
     catch (Exception e) { 
      Log.e("error",e.toString()); 
     } 
    } 

    @Override 
    public synchronized void close() { 
     if(applicationDatabase != null) 
      applicationDatabase .close(); 
       super.close(); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 

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

когда я запускаю код, я получаю сообщение об ошибке, как показано ниже, и приложение аварии: 08-28 11: 01: 10,785: W/Database (9975): файл не найден 08-28 11: 01: 10.875: E/Error (9975):/nullownexpensesdb: open failed: EROFS (файловая система только для чтения) 08-28 11: 01: 10.875: W/System.err (9975): java.io.FileNotFoundException:/nullownexpensesdb: open failed: EROFS (файловая система только для чтения) 08-28 11: 01: 10.875: W/System.err (9975): на libcore.io.IoBridge.open (IoBridge.java:416) 08 -28 11: 01: 10.880: W/System.err (9975): при java.io.FileOutputStream. (FileOutputStream.java:88) 08-28 11: 01: 10.880: W/System.err (9975): в java.io.FileOutputStream. (Файл OutputStream.java:128) 08-28 11: 01: 10.880: W/System.err (9975): при java.io.FileOutputStream. (FileOutputStream.java:117) 08-28 11: 01: 10.880: W /System.err(9975): at com.canmmy.expensesmanager.data.DatabaseAdapter.copyDatabase (DatabaseAdapter.java:70) 08-28 11: 01: 10.880: W/System.err (9975): at com.canmmy .expensesmanager.data.DatabaseAdapter. (DatabaseAdapter.java:50) 08-28 11: 01: 10.880: W/System.err (9975): at com.canmmy.expensesmanager.data.UserDbAdapter.processConnection (UserDbAdapter.java: 35) 08-28 11: 01: 10.880: W/System.err (9975): at com.canmmy.expensesmanager.data.UserDbAdapter.getUser (UserDbAdapter.java:77) 08-28 11: 01: 10.880: W/System.err (9975): at com.canmmy.expensesmanager.SplashActivity.initMain (SplashActivity.java:34) 08-28 11: 01: 10.880: W/System.err (9975)): at com.canmmy.expensesmanager.SplashActivity.access $ 0 (SplashActivity.java:32) 08-28 11: 01: 10.880: W/System.err (9975): at com.canmmy.expensesmanager.SplashActivity $ 1.run (SplashActivity.java:27) 08-28 11: 01: 10.880: W/System.err (9975): at android.os.Handler.handleCallback (Handler.java:615) 08-28 11: 01: 10.880 : W/System.err (9975): at android.os.Handler.dispatchMessage (Handler.java:92) 08-28 11: 01: 10.880: W/System.err (9975): at android.os.Looper .loop (Looper.java:137) 08-28 11: 01: 10.880: W/System.err (9975): at android.app.ActivityThread.main (ActivityThread.java:4898) 08-28 11:01 : 10.880: W/System.err (9975): at java.lang.reflect.Method.invokeNative (собственный метод) 08-28 11: 01: 10.880: W/System.err (9975): at java.lang. reflect.Method.invoke (Method.java:511) 08-28 11: 01: 10.880: W/System.err (9975): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1008) 08-28 11: 01: 10.880: W/System.err (9975): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:775) 08-28 11: 01: 10.880: W/System.err (9975): at dalvik. system.NativeStart.main (Native Method) 08-28 11: 01: 10.880: W/System.err (9975): вызвано: libcore.io.ErrnoException: open failed: EROFS (файловая система только для чтения) 08 -28 11: 01: 10,885: W/System.err (9975): в libcore.io.Posix.open (родной метод) 08-28 11: 01: 10.885: W/System.err (9975): at libcore.io.BlockGuardOs.open (BlockGuardOs.java:110) 08-28 11: 01: 10.885: W/System.err (9975): на libcore.io.IoBridge.open (IoBridge. java: 400) 08-28 11: 01: 10.885: W/System.err (9975): ... 19 еще 08-28 11: 01: 10.885: W/Database (9975): файл найден 08- 28 11: 01: 10.885: W/Database (9975): открыть DB 08-28 11: 01: 10.895: I/UserDbAdapter (9975): processConnection db ==== SQLiteDatabase: /data/data/com.canmmy. costmanager/databases/ownexpensesdb 08-28 11: 01: 10.895: запрос I/sqlite-select (9975): выберите UserId, Name, Password FROM User; 08-28 11: 01: 10.895: E/SQLiteLog (9975): (1) нет такой таблицы: Пользователь 08-28 11: 01: 10.895: D/AndroidRuntime (9975): выключение VM 08-28 11 : 01: 10.895: W/dalvikvm (9975): threadid = 1: выход с отключенным исключением (группа = 0x410502a0) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): FATAL EXCEPTION: main 08- 28 11: 01: 10.900: E/AndroidRuntime (9975): android.database.sqlite.SQLiteException: нет такой таблицы: User (код 1): при компиляции: выберите UserId, Name, Password FROM User; 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.database.sqlite.SQLiteConnection.nativePrepareStatement (собственный метод) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): у android .database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection.java:1011) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.database.sqlite.SQLiteConnection.prepare (SQLiteConnection.java:622) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.database.sqlite.SQLiteSession.prepare (SQLiteSession.java:588) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:58) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:37) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): при ndroid.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:44) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1314) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.database.sqlite.SQLiteDatabase.rawQuery (SQLiteDatabase.java:1253) 08-28 11: 01: 10.900: E/AndroidRuntime (9975) : at com.canmmy.expensesmanager.data.UserDbAdapter.getUser (UserDbAdapter.java:81) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at com.canmmy.expensesmanager.SplashActivity.initMain (SplashActivity. java: 34) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at com.canmmy.expensesmanager.SplashActivity.access $ 0 (SplashActivity.java:32) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): на com.canmmy.expensesmanager.SplashActivity $ 1.ru n (SplashActivity.java:27) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.os.Handler.handleCallback (Handler.java:615) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.os.Handler.dispatchMessage (Handler.java:92) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.os.Looper.loop (Looper. java: 137) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at android.app.ActivityThread.main (ActivityThread.java:4898) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at java.lang.reflect.Method.invokeNative (собственный метод) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at java.lang.reflect.Method.invoke (Method.java:511)) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1008) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:775) 08-28 11: 01: 10.900: E/AndroidRuntime (9975): at dalvik.system.NativeStart.main (родной метод)

ответ

0

Следующий код работает для меня. Я поместил базу данных в папку с ресурсами.

Единственное, что вы должны знать, если вы изменили базу данных в папке с активами, вам нужно сначала удалить приложение с помощью adb uninstall yourpackagename, иначе приложение будет обновлено, но база данных не будет. Мне потребовалось немного, чтобы понять это. Надеюсь это поможет.

Примечание: TDAdb - это метод, определяющий переменные, используемые с базой данных. В этом случае TDAdb.onCreate и TDAdb.onUpdate не должны ничего делать.

public class TDAdbHelper extends SQLiteOpenHelper { 

public static String DATABASE_PATH; 
public static final String DATABASE_NAME = "tda.db"; 
private static final int DATABASE_VERSION = 1; 
private Context context; 
private SQLiteDatabase db; 

public TDAdbHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    this.context = context; 
    String packageName = context.getPackageName(); 
    DATABASE_PATH = String.format(context.getString(R.string.str_databasepath), 
      packageName); 
    openDataBase(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    TDAdb.onCreate(db); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    TDAdb.onUpgrade(db, oldVersion, newVersion); 
} 

// Performing a database existence check 
private boolean checkDataBase() { 
    SQLiteDatabase checkDb = null; 
    try { 
     String path = DATABASE_PATH + DATABASE_NAME; 
     checkDb = SQLiteDatabase.openDatabase(path, null, 
       SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLException e) { 
     Log.e(this.getClass().toString(), context.getString(R.string.str_error_while_checking_db)); 
    } 

    if (checkDb != null) { 
     checkDb.close(); 
    } 
    return checkDb != null; 
} 

// Method for copying the database 
private void copyDataBase() throws IOException { 
    //Log.i(this.getClass().toString(), "... in copyDataBase "); 
    InputStream externalDbStream = context.getAssets().open(DATABASE_NAME); 

    String outFileName = DATABASE_PATH + DATABASE_NAME; 

    OutputStream localDbStream = new FileOutputStream(outFileName); 

    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = externalDbStream.read(buffer)) > 0) { 
     localDbStream.write(buffer, 0, bytesRead); 
    } 

    localDbStream.close(); 
    externalDbStream.close(); 
} 

public void createDataBase() { 
    //Log.i(this.getClass().toString(), "... in createDataBase "); 
    boolean dbExist = checkDataBase(); 
    if (!dbExist) { 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      Log.e(this.getClass().toString(), context.getString(R.string.str_copying_error)); 
      throw new Error(context.getString(R.string.str_error_copying_database_exclamation)); 
     } 
    } else { 
     //Log.i(this.getClass().toString(), "Database already exists"); 
    } 
} 

public SQLiteDatabase openDataBase() throws SQLException { 
    String path = DATABASE_PATH + DATABASE_NAME; 
    // Log.i(this.getClass().toString(), "Starting openDatabase " + path); 
    if (db == null) { 
     createDataBase(); 
     db = SQLiteDatabase.openDatabase(path, null, 
       SQLiteDatabase.OPEN_READWRITE); 
    } 

    return db; 
} 

} 

Отличный день.

Смежные вопросы