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

复制现有数据库sqlite并在设备-android上运行,android,sqlite,Android,Sqlite,我想检查数据库是否存在。如果不存在,我会将文件复制到特定路径。此处代码如下所示: Main.java DatabaseAdapter.java 当我运行代码时,出现如下错误,应用程序崩溃: 08-28 11:01:10.785:W/数据库(9975):找不到文件 08-28 11:01:10.875:E/错误(9975):/nullownpexpensesdb:open失败:EROFS(只读文件系统) 08-28 11:01:10.875:W/System.err(9975):java.io.F

我想检查数据库是否存在。如果不存在,我会将文件复制到特定路径。此处代码如下所示:

Main.java

DatabaseAdapter.java

当我运行代码时,出现如下错误,应用程序崩溃: 08-28 11:01:10.785:W/数据库(9975):找不到文件 08-28 11:01:10.875:E/错误(9975):/nullownpexpensesdb:open失败:EROFS(只读文件系统) 08-28 11:01:10.875:W/System.err(9975):java.io.FileNotFoundException:/nullownsexpensesdb:open失败: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.(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/System.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):位于com.canmmy.expensesmanager.SplashActivity.initMain(SplashActivity.java:34) 08-28 11:01:10.880:W/System.err(9975):位于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.invokenactive(本机方法) 08-28 11:01:10.880:W/System.err(9975):位于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(本机方法) 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/系统错误(9975):。。。还有19个 08-28 11:01:10.885:W/数据库(9975):找到文件 08-28 11:01:10.885:W/数据库(9975):打开数据库 08-28 11:01:10.895:I/UserDbAdapter(9975):processConnection db====SQLiteDatabase:/data/data/com.canmmy.expensesmanager/databases/ownexpensesdb 08-28 11:01:10.895:I/sqlite选择查询(9975):从用户处选择用户ID、名称、密码; 08-28 11:01:10.895:E/SQLiteLog(9975):(1)没有这样的表:用户 08-28 11:01:10.895:D/AndroidRuntime(9975):关闭虚拟机 08-28 11:01:10.895:W/dalvikvm(9975):threadid=1:线程以未捕获异常退出(组=0x410502a0) 08-28 11:01:10.900:E/AndroidRuntime(9975):致命异常:主 08-28 11:01:10.900:E/AndroidRuntime(9975):android.database.sqlite.SQLiteException:没有这样的表:User(代码1):,编译时:从User中选择UserId、Name、Password; 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.acquiredPreparedStatement(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):位于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):位于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):位于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上。
   UserDbAdapter objChatMessageDbAdapter = new UserDbAdapter();
   objChatMessageDbAdapter.context = context;
   User objChatMessage = objChatMessageDbAdapter.getUser();

   if(objChatMessage.getID()<1){

        //call register intent
   }else{
        // call the first intent
   }
    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;
   }
}
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) { 
  }
    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;
}

}