Я хочу проверить базу данных, если она существует или нет. Если этого не было, я скопирую файл по определенному пути. Вот код, как показано ниже:Скопируйте существующий 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 (родной метод)