0

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();
}
Oleg Golomoz
  • 502
  • 4
  • 12
  • I'd suggest that you **1)** use the tool that you used to create the pre-existing database to open the database, check that it has rows (if not add them) and save/close the tool (repeat the above until you are sure it has saved rows). **2)** Delete the current database file from the assets folder. **3)** Re-copy the database file into the assets folder. **4)** Delete the App's data or uninstall the App and then rerun the App. – MikeT Apr 21 '19 at 01:32
  • You may also wish to consider the answer given at [A pre-populated database does not work at API 28 throws “no such table” exception](https://stackoverflow.com/questions/55336900/a-pre-populated-database-does-not-work-at-api-28-throws-no-such-table-exceptio/55346290#55346290). As I believe that your code would not work for later versions of Android due to using `this.getReadableDatabase();` in the **createdatabase()** method. – MikeT Apr 21 '19 at 01:36
  • I create and prefill this data base out of Android Studio and application. I create it Eclipse using SQLiteHelper. Everything worked fine: I could easily create db and tables, fill it and then query. Then I copied this db to my application... – Oleg Golomoz Apr 21 '19 at 09:13
  • I'm absolutely sure it has rows. And I can easily query them in Eclipse, but nothing work in Android Studio – Oleg Golomoz Apr 21 '19 at 09:33

0 Answers0