مشکل کار با دیتابیس در برنامه
سلام به همه
دوستان من اومدم برای برنامه یک کلاس database تعریف کردم که دستورات دیتابیس رو توی خودش قرار بده.که کد های قسمت دیتابیس اینه:
package com.appnegar.book.fireyourself;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class database extends SQLiteOpenHelper {
public final String path="data/data/com.appnegar.book.fireyourself/databases/";
public final String Name="database";
public SQLiteDatabase mydb;
private final Context mycontext;
public database(Context context) {
super(context, "database", null, 1);
mycontext=context;
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
public void useable(){
boolean checkdb=checkdb();
if(checkdb){
}else{
this.getReadableDatabase();
try{
copydatabase();
}catch(IOException e){
}
}
}
public void open(){
mydb=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READWRITE);
}
public void close(){
mydb.close();
}
public boolean checkdb(){
SQLiteDatabase db=null;
try{
db=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READONLY);
}
catch(SQLException e)
{
}
//mydb.close();
return db !=null ? true:false ;
}
public void copydatabase() throws IOException{
OutputStream myOutput = new FileOutputStream(path+Name);
byte[] buffer = new byte[1024];
int length;
InputStream myInput = mycontext.getAssets().open(Name);
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myInput.close();
myOutput.flush();
myOutput.close();
}
}
و در اکتیویتی Main هم کد اینه:
package com.appnegar.book.fireyourself;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class Main extends ActionBarActivity {
private database db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
db = new database(this);
db.useable();
}
}
فایل دیتابیس رو هم گذاشتم توی assets ( در ایکلیپس ) و اسمش رو گذاشتم database و اون .db آخرش رو ورداشتم. اما وقتی نرم افزار RUN میشه. این خطا رو میده. حالا باید چیکار کنم؟ کجای کار مشکل داره؟ :( گزارش کامل لاگ کت رو گذاشتم تو این لینک: http://txt.do/olu6
10-22 21:05:48.924: E/SqliteDatabaseCpp(1631): sqlite3_open_v2("data/data/com.appnegar.book.fireyourself/databases/database", &handle, 1, NULL) failed
10-22 21:05:48.954: E/SQLiteDatabase(1631): Failed to open the database. closing it.
10-22 21:05:48.954: E/SQLiteDatabase(1631): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
با خودم گفتم شاید دیتابیسی که من ایجاد می کنم مشکل داره. اما از دیتابیس های دیگه هم که تو سورس بود استفاده کردم. بازم همین مشکل رو داشت :(
مشکل حل شد!
گویا اون خطا مربوط میشد به اون قسمت chekdb که درواقع میگفت ببین اگه هست که هیچ اگه نیست بساط و اونم نگاه می کرد و چون میدید که نیست اون خطلا رو میداد که آقا فایل اینجا نیست! و در ادامه میرفت که فایل رو در روت کپی کنه. اینکه من دیتابیس رو پیدا نمی کردم به این دیلیل بود که به روت دسترسی نداشم و داشتم تو دیتای موبایل دنبال دیتابیس میگشتم!
اگه کسی این مشکل رو مثل من داشت از برنامه روت اکسپلورر استفاده کنه میبینه که دیتبابیس کپی شده <3
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .