I've got a prefilled database in assets. I copy this database after first launch and try to query, but cursor
never has data. It shows all columns of selected table
but getCount()
is always 0. Where is my mistake? Here is my code:
public class DataBaseHelper extends SQLiteOpenHelper {
private Context mycontext;
private String DB_PATH;
private static String DB_NAME = "championBuilds.db";//the extension may be .sqlite or .db
public SQLiteDatabase myDataBase;
public DataBaseHelper(Context context) throws IOException, SQLException {
super(context,DB_NAME,null,1);
this.mycontext=context;
DB_PATH = "/data/data/com.app.myapp/databases/";
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 {
// 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);
//Open your local db as the input stream
InputStream myinput = mycontext.getAssets().open(DB_NAME);
// 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();
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public List<Book> getAllBooks() {
List<Book> books = new ArrayList();
String selectQuery = "SELECT * FROM Books";
Cursor cursor = myDataBase.rawQuery(selectQuery, null);
//if TABLE has rows
if (cursor.moveToFirst()) {
//Loop through the table rows
do {
Book book = new Book();
book.id = cursor.getInt(0);
book.setTitle(cursor.getString(1));
book.setAuthor(cursor.getString(2));
// Add book to books
books.add(book);
} while (cursor.moveToNext());
}
myDataBase.close();
return books;
}
}
And there is how I call these methods:
try {
db = new DataBaseHelper(this);
List<Book> books = db.getAllBooks();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}