تالار گفتمان nCIS.ir

نسخه‌ی کامل: مشکل در باز کردن دیتابیس کپی شده توسط برنامه
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
با سلام من یه برنامه دارم که میاد دیتابیس رو از assets می گیره و اونو کپی میکنه،همه ی مراحل انجام میشه،برنامه خطا نمیده،دیتابیس هم در آدرس مورد نظر کپی میشه،به طور کامل هم کپی میشه حجم دیتابیس رو مشاهده کردم،اما وقتی یه دستور Cursor برای گرفتن مقادیر از دیتابیس مینویسم و کارهاشو انجام میدم توی قسمت run این ارور ها رو میده

E/SQLiteDatabase: Failed to open database 'data/data/ir.dream.a28raz/databases/database'.
                android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14): Could not open database, (OS error - 2:No such file or directory)
                    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
                    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:217)
                    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:201)
                    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:493)
                    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:194)
                    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:183)
                    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:827)
                    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:814)
                    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:714)
                    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:689)
                    at ir.dream.ssssssssss.database.open(database.java:68)
                    at ir.dream.ssssssssss.MainActivity.onCreate(MainActivity.java:16)
                    at android.app.Activity.performCreate(Activity.java:6367)
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397)
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504)
                    at android.app.ActivityThread.access$900(ActivityThread.java:165)
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368)
                    at android.os.Handler.dispatchMessage(Handler.java:102)
                    at android.os.Looper.loop(Looper.java:150)
                    at android.app.ActivityThread.main(ActivityThread.java:5546)
                    at java.lang.reflect.Method.invoke(Native Method)
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
I/Process: Sending signal. PID: 28755 SIG: 9
Application terminated.



این فایل main جاوا
package ir.dream.a28raz;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
private database db;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       db = new database(this);
       db.usedb();

       db.opendb();

       String s = db.dasplay_title();
       Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
       db.close();

   }
}

اینم database کلاس
package ir.dream.a28raz;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class database extends SQLiteOpenHelper {
   private Context context;
   private static String db_name = "database";
   private String db_path = "data/data/ir.dream.a28raz/databases/" + db_name;
   private SQLiteDatabase mydb = null;

   public database(Context context) {
       super(context, db_name, null, 1);
       this.context = context;
   }

   @Override
   public void onCreate(SQLiteDatabase sqLiteDatabase) {

   }

   @Override
   public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

   }

   public void usedb() {
       if (checkdb()) {
           //do nothing;
       } else {
           this.getReadableDatabase();

           try {
               copyDB();
           } catch (IOException e) {
           }
       }
   }

   public void opendb() {
       mydb = SQLiteDatabase.openDatabase(db_path, null, SQLiteDatabase.OPEN_READWRITE);
   }

   public boolean checkdb(){
       try{
     opendb();
       }
       catch(SQLException e)
       {
           if (mydb.isOpen()){
               mydb.close();
           }

       }
       //mydb.close();
       return mydb !=null ? true:false ;

   }

   private void copyDB() throws IOException {
       InputStream dbInput = context.getAssets().open(db_name);
       String outFile = db_path ;
       OutputStream dbOutput = new FileOutputStream(outFile);

       byte[] buffer = new byte[1024];
       int length;
       while ((length = dbInput.read(buffer))>0) {
           dbOutput.write(buffer,0,length);
       }

       dbOutput.flush();
       dbOutput.close();
       dbInput.close();

   }

   public void close(){
       mydb.close();
   }

   public String dasplay_title(){
       Cursor cursor = mydb.rawQuery("select * from table" , null);
       cursor.moveToFirst();
       String s = cursor.getString(1);
       return s;
   }
}
توی اپلیکیشن SuperSU یا Super User (هرکدوم نصب کردین) چک کنید Root Explorer مجوز دسترسی داره یا نه.
بله استاد داده،کلا هیچ مشکلی نیست فقط وقتی دیتابیس در آدرس مورد نظر کپی میشه این ارور رو میده.
پست اولی بروز شده همهاطلاعات رو دادم،مرسی ممنون میشم کمکم کنید.
الان اسم پکیجی که توی خطا اعلام شده با اون اسمی که شما توی کدتون نوشتین فرق میکنه. کدها رو بررسی کنید. بهتره مسیر پوشه data برنامه رو اینطوری بخونین:
String dataDir = getApplicationContext().getFilesDir().getAbsolutePath() + "/";
سورس قرار داده شد
کسی مشکلشو نفهمید؟