-1

I am creating a database in sqlitebrowser. I copy that database file by manually converting to .sqlite format and copy it to assets->databases->(file) . and try to access it, but I am not able to do so.

My database code is

public class Data extends SQLiteOpenHelper
{
  SQLiteDatabase databaseobject; 

      static String DB_PATH = "/data/data/vishesh.goswami.ithinkk/databases/";
        static String DB_NAME = "project_db.sqlite";
        SQLiteDatabase db;
       private  Context mContext=null;



        static int l=1;
        static String DATABASE_NAME="project_db.sqlite";
        String getquestion=null;


      Data(Context context)
         {
             super(context, DATABASE_NAME, null, l);
             this.mContext=context;
        }

      public void createDataBase() throws IOException {
            boolean mDataBaseExist = checkDataBase();
            if (!mDataBaseExist) {
                this.getReadableDatabase();
                try {
                    copyDataBase();
                } catch (IOException mIOException) {
                    mIOException.printStackTrace();
                    throw new Error("Error copying database");
                } finally {
                    this.close();
                }
            }
        }

        /** This method checks whether database is exists or not **/
        private boolean checkDataBase() {
            try {
                final String mPath = DB_PATH + DB_NAME;
                db=SQLiteDatabase.openDatabase(mPath, null,SQLiteDatabase.OPEN_READONLY);

                // File file = new File(mPath);
                //if (file.exists())
                  //  return true;
               // else
                 //   return false;
            } catch (SQLiteException e) {
                e.printStackTrace();
                return false;
            }
            if(db!=null){
                db.close();
            }
            return db!=null?true :false;
        }

        /**
         * This method will copy database from /assets directory to application
         * package /databases directory
         **/
        private void copyDataBase() throws IOException {
            try {

                InputStream mInputStream = mContext.getAssets().open(DB_NAME);
                String outFileName = DB_PATH + DB_NAME;
                OutputStream mOutputStream = new FileOutputStream(outFileName);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = mInputStream.read(buffer)) > 0) {
                    mOutputStream.write(buffer, 0, length);
                }
                mOutputStream.flush();
                mOutputStream.close();
                mInputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /** This method open database for operations **/
        public boolean openDataBase() throws SQLException {
            String mPath = DB_PATH + DB_NAME;
            databaseobject = SQLiteDatabase.openDatabase(mPath, null,
                    SQLiteDatabase.OPEN_READWRITE);
            return databaseobject!=null;
        }

        /** This method close database connection and released occupied memory **/
        @Override
        public synchronized void close() {
            if (databaseobject != null)
                databaseobject.close();
            SQLiteDatabase.releaseMemory();
            super.close();
        }




    @Override
    public void onCreate(SQLiteDatabase arg0) {
         String query="create table if not exists data (id integer primary key autoincrement, "

            + "question text , option1 text ,option2 text ,option3 text,option4 text )";

my testactivity code is

public class TestActivity extends Activity {

Data object,projectobject;
SQLiteDatabase mydatabase;
TextView t;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    object =new Data(this);
    object.open();
            t=(TextView) findViewById(R.id.textView1);
    t.setText("Ques."+ " " + object.fetchQuestion(1)); 

    projectobject = new Data(this);



      try{
          projectobject.createDataBase();
      }
      catch(IOException e)
      {
          Toast.makeText(getBaseContext(),"it not  worked11"+e.getMessage(), Toast.LENGTH_SHORT ).show();

      } 



      try{
          projectobject.openDataBase();

          mydatabase=projectobject.getReadableDatabase();
          projectobject.close(); 
      }
      catch(Exception e){
          Toast.makeText(getBaseContext(),"it not  worked2222"+e.getMessage(), Toast.LENGTH_SHORT ).show();

      }


    object.close1();
}

but my app stops : unfortunately showing unable to fetch database. I am using icecream sandwich 4.0.4 Any help is appreciated. logcat is :

07-22 17:32:18.583: D/jdwp(21577): sendBufferedRequest : len=0x45
07-22 17:32:18.800: D/ActivityThread(21577): BIND_APPLICATION handled : 0 / AppBindData{appInfo=ApplicationInfo{418495f0 vishesh.goswami.ithinkk}}
07-22 17:32:19.248: D/AndroidRuntime(21577): Shutting down VM
07-22 17:32:19.249: W/dalvikvm(21577): threadid=1: thread exiting with uncaught exception (group=0x40f3d258)
07-22 17:32:19.289: E/AndroidRuntime(21577): FATAL EXCEPTION: main
07-22 17:32:19.289: E/AndroidRuntime(21577): java.lang.RuntimeException: Unable to start activity ComponentInfo{vishesh.goswami.ithinkk/vishesh.goswami.ithinkk.TestActivity}: java.lang.NullPointerException
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.os.Looper.loop(Looper.java:154)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.ActivityThread.main(ActivityThread.java:4624)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at java.lang.reflect.Method.invokeNative(Native Method)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at java.lang.reflect.Method.invoke(Method.java:511)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at dalvik.system.NativeStart.main(Native Method)
07-22 17:32:19.289: E/AndroidRuntime(21577): Caused by: java.lang.NullPointerException
07-22 17:32:19.289: E/AndroidRuntime(21577):    at vishesh.goswami.ithinkk.Data.onCreate(Data.java:127)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:165)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at vishesh.goswami.ithinkk.Data.open(Data.java:149)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at vishesh.goswami.ithinkk.TestActivity.onCreate(TestActivity.java:22)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.Activity.performCreate(Activity.java:4479)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
07-22 17:32:19.289: E/AndroidRuntime(21577):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
07-22 17:32:19.289: E/AndroidRuntime(21577):    ... 11 more
thepoosh
  • 12,497
  • 15
  • 73
  • 132
Vishesh
  • 308
  • 1
  • 9

1 Answers1

0

Try following link it may help you because it was helpful for me

Database not copying from assets

EDIT

Try the DatabaseHelper class as user Jaydeep has used in this answer Database not copying from assets

public class DataBaseHelper extends SQLiteOpenHelper{
private Context mycontext;

private String DB_PATH = "/data/data/gr.peos/databases/";
//private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
private static String DB_NAME = "BLib.sqlite";//the extension may be .sqlite or .db
public SQLiteDatabase myDataBase;
/*private String DB_PATH = "/data/data/"
                            + mycontext.getApplicationContext().getPackageName()
                            + "/databases/";*/

public DataBaseHelper(Context context) throws IOException  {
    super(context,DB_NAME,null,1);
    this.mycontext=context;
    boolean dbexist = checkdatabase();
    if(dbexist)
    {
        //System.out.println("Database exists");
        opendatabase(); 
    }
    else
    {
        System.out.println("Database doesn't exist");
    createdatabase();
    }

}

public void createdatabase() throws IOException{
    boolean dbexist = checkdatabase();
    if(dbexist)
    {
        //System.out.println(" Database exists.");
    }
    else{
        this.getReadableDatabase();
    try{
            copydatabase();
        }
        catch(IOException e){
            throw new Error("Error copying database");
        }
    }
}
private boolean checkdatabase() {
    //SQLiteDatabase checkdb = null;
    boolean checkdb = false;
    try{
        String myPath = DB_PATH + DB_NAME;
        File dbfile = new File(myPath);
        //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
        checkdb = dbfile.exists();
    }
    catch(SQLiteException e){
        System.out.println("Database doesn't exist");
    }

    return checkdb;
}
private void copydatabase() throws IOException {

    //Open your local db as the input stream
    InputStream myinput = mycontext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outfilename = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myoutput = new FileOutputStream("/data/data/gr.peos/databases/BLib.sqlite");

    // transfer byte to inputfile to outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myinput.read(buffer))>0)
    {
        myoutput.write(buffer,0,length);
    }

    //Close the streams
    myoutput.flush();
    myoutput.close();
    myinput.close();

}

public void opendatabase() throws SQLException
{
    //Open the database
    String mypath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);

}



public synchronized void close(){
    if(myDataBase != null){
        myDataBase.close();
    }
    super.close();
}

Also, note that there is some difference in your approach and approach used by Jaydeep. Also, before accessing the database using open() method, you need to call the createdatabase() method. maybe this can help you to resolve the issue.

Community
  • 1
  • 1