简体   繁体   English

复制现有数据库sqlite并在设备上运行-android

[英]Copy the existing database sqlite and run at device - android

I want to check the database if it's exists or not. 我想检查数据库是否存在。 If did not exist, i will copy the file to the specific path. 如果不存在,我会将文件复制到特定路径。 Here the code as below: 这里的代码如下:

Main.java 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 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 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) { 
  }

when I run the code, I get error as below and the application is crash: 08-28 11:01:10.785: W/Database(9975): file not found 08-28 11:01:10.875: E/Error(9975): /nullownexpensesdb: open failed: EROFS (Read-only file system) 08-28 11:01:10.875: W/System.err(9975): java.io.FileNotFoundException: /nullownexpensesdb: open failed: EROFS (Read-only file system) 08-28 11:01:10.875: W/System.err(9975): at libcore.io.IoBridge.open(IoBridge.java:416) 08-28 11:01:10.880: W/System.err(9975): at java.io.FileOutputStream.(FileOutputStream.java:88) 08-28 11:01:10.880: W/System.err(9975): at java.io.FileOutputStream.(FileOutputStream.java:128) 08-28 11:01:10.880: W/System.err(9975): at 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/S 运行代码时,出现以下错误,应用程序崩溃:08-28 11:01:10.785:W / Database(9975):找不到文件08-28 11:01:10.875:E / Error(9975) ):/ nullownexpensesdb:打开失败:EROFS(只读文件系统)08-28 11:01:10.875:W / System.err(9975):java.io.FileNotFoundException:/ nullownexpensesdb:打开失败: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 /系统。 err(9975):位于java.io.FileOutputStream。(FileOutputStream.java:88)08-28 11:01:10.880:W / System.err(9975):位于java.io.FileOutputStream。(FileOutputStream.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) :位于com.canmmy.expensesmanager.data.DatabaseAdapter.copyDatabase(DatabaseAdapter.java:70)08-28 11:01:10.880:W / System.err(9975):位于com.canmmy.expensesmanager.data.DatabaseAdapter。( DatabaseAdapter.java:50)08-28 11:01:10.880:W / S ystem.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. ystem.err(9975):在com.canmmy.expensesmanager.data.UserDbAdapter.processConnection(UserDbAdapter.java:35)08-28 11:01:10.880:W / System.err(9975):在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) ):在com.canmmy.expensesmanager.SplashActivity $ 1.run(SplashActivity.java:27)08-28 11:01:10.880:W / System.err(9975):在android.os.Handler.handleCallback(Handler.java :615)08-28 11:01:10.880:W / System.err(9975):位于android.os.Handler.dispatchMessage(Handler.java:92)08-28 11:01:10.880:W / System.err (9975):位于android.os.Looper.loop(Looper.java:137)08-28 11:01:10.880:W / System.err(9975):位于android.app.ActivityThread.main(ActivityThread.java: 4898)08-28 11:01:10.880:W / System.err(9975):在java。 lang.reflect.Method.invokeNative(Native Method) 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): Caused by: libcore.io.ErrnoException: open failed: EROFS (Read-only file system) 08-28 11:01:10.885: W/System.err(9975): at libcore.io.Posix.open(Native Method) 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): at libcore.io.IoBridge.open(IoBridge.java:400) 08-28 11:01:10.885: W/System.err(9975): ... 19 more 08-28 11:01:10.885: W/Database(9975): file found 08-28 11:01:10.885: W/Database(9975): open DB 08-28 11:01:1 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):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1008)08-28 11:01:10.880:W / System.err( 9975):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)08-28 11:01:10.880:W / System.err(9975):位于dalvik.system.NativeStart.main(Native方法)08-28 11:01:10.880:W / System.err(9975):原因:libcore.io.ErrnoException:打开失败: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):位于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:1 0.895: I/UserDbAdapter(9975): processConnection db====SQLiteDatabase: /data/data/com.canmmy.expensesmanager/databases/ownexpensesdb 08-28 11:01:10.895: I/sqlite-select query(9975): Select UserId, Name, Password FROM User; 0.895:I / UserDbAdapter(9975):processConnection db ==== SQLiteDatabase:/data/data/com.canmmy.expensesmanager/databases/ownexpensesdb 08-28 11:01:10.895:I / sqlite-select查询(9975):选择“用户名”,“名称”,“来自用户的密码”; 08-28 11:01:10.895: E/SQLiteLog(9975): (1) no such table: User 08-28 11:01:10.895: D/AndroidRuntime(9975): Shutting down VM 08-28 11:01:10.895: W/dalvikvm(9975): threadid=1: thread exiting with uncaught exception (group=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: no such table: User (code 1): , while compiling: Select 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:线程以未捕获的异常退出(group = 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(Native Method) 08-28 11:01:10.900: E/AndroidRuntime(9975): at 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): at 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): at android.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 08-28 11:01:10.900:E / AndroidRuntime(9975):在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):位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:622)08-28 11 :01:10.900:E / AndroidRuntime(9975):位于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):位于android.database.sqlite.SQLiteQuery。(SQLiteQuery.java:37)08-28 11:01: 10.900:E / AndroidRuntime(9975):位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)08-28 11:01:10.900:E / AndroidRuntime(9975):位于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): at com.canmmy.expensesmanager.SplashActivity$1.run(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:1 :10.900:E / AndroidRuntime(9975):在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)08-28 11:01:10.900:E / AndroidRuntime(9975):在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):在com.canmmy.expensesmanager.SplashActivity.access $ 0(SplashActivity.java:32)08-28 11:01:10.900:E / AndroidRuntime(9975):在com.canmmy。 Expensesmanager.SplashActivity $ 1.run(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):在android.os.Handler.dispatchMessage(Handler.java:92)08-28 11:01:10.900:E / AndroidRuntime(9975):在android.os.Looper.loop( Looper.java:137)08-28 11:01:10.900:E / AndroidRuntime(9975):位于android.app.ActivityThread.main(ActivityThread.java:4898)08-28 11:01:1 0.900: E/AndroidRuntime(9975): at java.lang.reflect.Method.invokeNative(Native Method) 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(Native Method) 0.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):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)08-28 11:01:10.900:E / AndroidRuntime(9975):在dalvik.system.NativeStart .main(本机方法)

The following code works for me. 以下代码对我有用。 I put the database in the assets folder. 我将数据库放在资产文件夹中。

The only thing that you have to be aware of, if you change the database in the asset folder, you have to first uninstall the application with adb uninstall yourpackagename, otherwise the app will be updated but the database will not. 您唯一需要了解的是,如果您更改资产文件夹中的数据库,则必须先使用adb uninstall yourpackagename卸载应用程序,否则将更新该应用程序,但数据库将不会更新。 It took me a little bit to figure this out. 我花了一点时间才弄清楚。 Hope this helps. 希望这可以帮助。

Note: TDAdb is a method that defines the variables used with the database. 注意:TDAdb是一种定义与数据库一起使用的变量的方法。 The TDAdb.onCreate and TDAdb.onUpdate don't have to do anything in this case. 在这种情况下,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;
}

}

Have a great day. 祝你有美好的一天。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM