android – Reading sqlite file from asset folder-ThrowExceptions

Exception or error:

i am developing an application in which i want to read an sqlite database file from the asset folder of the project. i have searched the web but nothing found helpful. please help me.
Thanks.

How to solve:

You cannot directly open files from assets folder. Instead, you need to copy the sqlite database of your assets folder into an internal/external storage and later use the File path to open the file. Try out below code to read the sqlite database from assests and copy it into sdcard to use it.

public class DataBaseHelper extends SQLiteOpenHelper {
   private Context mycontext;
   private static String DB_NAME = "(datbasename).sqlite";
   private static String DB_PATH ="/data/data/"+BuildConfig.APPLICATION_ID+"/databases/";
   public SQLiteDatabase myDataBase;

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() {

    boolean checkdb = false;
    try {
        String myPath = DB_PATH + DB_NAME;
        File dbfile = new File(myPath);
        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(outfilename);

    // 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();
}
}

###

Please use SQLiteAssetHelper, which has all the code that you need to install a pre-packaged database when your app is first run.

###

Basically you can get an InputStream (from the AssetManager open function) for a file name and write it to an OutputStream.

InputStream inputStream = getAssets().open(fileName);

If you create your database using openOrCreateDatabase you might want to put the database in the databases folder…

    String fileName = "MySQLiteDB.db";
    File file = getDatabasePath(fileName );
    if (!file.exists()) {
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdir();
        }

        InputStream inputStream = getAssets().open(DATABASE_NAME);
        OutputStream outputStream = new FileOutputStream(file);
        byte[] buffer = new byte[1024 * 8];
        int numOfBytesToRead;
        while((numOfBytesToRead = inputStream.read(buffer)) > 0)
        outputStream.write(buffer, 0, numOfBytesToRead);
        inputStream.close();
        outputStream.close();
    }

    db = SQLiteDatabase.openOrCreateDatabase(file, null);

###

1. Make the SQLite database file.


    If you don't have a sqlite manager I recommend you to download the opensource SQLite Database Browser available for Win/Linux/Mac. Make database file.

    

2. Use this database in your Android application.

    Now put your database file in the "assets" folder of your project and create a Database Helper class by extending the SQLiteOpenHelper class


  //Constructor
  public Databasehelper(Context context)
  {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;
  }

  //Create a empty database on the system
  public void createDatabase() throws IOException
  {
        boolean dbExist = checkDataBase();

        if(dbExist)
        {
              Log.v("DB Exists", "db exists");
              // By calling this method here onUpgrade will be called on a
              // writeable database, but only if the version number has been
              // bumped
              //onUpgrade(myDataBase, DATABASE_VERSION_old, DATABASE_VERSION);
        }

        boolean dbExist1 = checkDataBase();
        if(!dbExist1)
        {
              this.getReadableDatabase();
              try
              {
                    this.close();    
                    copyDataBase();
              }
              catch (IOException e)
              {
                    throw new Error("Error copying database");
           }
        }
  }

  //Check database already exist or not
  private boolean checkDataBase()
  {
        boolean checkDB = false;
        try
        {
              String myPath = DATABASE_PATH + DATABASE_NAME;
              File dbfile = new File(myPath);
              checkDB = dbfile.exists();
        }
        catch(SQLiteException e)
        {
        }
        return checkDB;
  }

  //Copies your database from your local assets-folder to the just created empty database in the system folder
  private void copyDataBase() throws IOException
  {
        String outFileName = DATABASE_PATH + DATABASE_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
        InputStream myInput = myContext.getAssets().open(DATABASE_NAME);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0)
        {
              myOutput.write(buffer, 0, length);
        }
        myInput.close();
        myOutput.flush();
        myOutput.close();
  }

  //delete database
  public void db_delete()
  {
        File file = new File(DATABASE_PATH + DATABASE_NAME);
        if(file.exists())
        {
              file.delete();
              System.out.println("delete database file.");
        }
  }

  //Open database
  public void openDatabase() throws SQLException
  {
        String myPath = DATABASE_PATH + DATABASE_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
  }

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

  public void onCreate(SQLiteDatabase db)
  {
  }

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  {    
        if (newVersion > oldVersion)
        {
              Log.v("Database Upgrade", "Database version higher than old.");
              db_delete();
        }
  }

//add your public methods for insert, get, delete and update data in database.
}

enter code here

ReferLink:http://androidtutorials60.blogspot.in/2013/03/1.html

Leave a Reply

Your email address will not be published. Required fields are marked *