0

When I try to open my database file with sqlite database it shows me the following errors:

[2014-05-19 23:50:51] Failed to open database file db_penpal.db
[2014-05-19 23:50:51] null

Does that mean that my database contains some bugs? If yes, how can I solve that?

Thanks in advance.

public class Database_handler extends SQLiteOpenHelper {

    private static final int database_version = 1;
    public static final String database_name = "db_e_pal.db";

    public Database_handler(Context context) {
        super(context, database_name, null, database_version);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        //Creation de la table user
        String create_t_user
                = "CREATE TABLE IF NOT EXISTS user ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "username varchar(20) NOT NULL,"
                + "password varchar(20) NOT NULL,"
                + "connected INTEGER(0) NOT NULL);";
        String create_t_friend_request
                = "CREATE TABLE IF NOT EXISTS friend_request ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "username varchar(20) NOT NULL,"
                + "ID_last_message INTEGER NOT NULL);";

        String create_t_friend
                = "CREATE TABLE IF NOT EXISTS friend ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "username varchar(20) NOT NULL," 
                + "connected INTEGER(0) NOT NULL);";

        String create_t_message
                = "CREATE TABLE IF NOT EXISTS message ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "ID_friend INTEGER NOT NULL,"
                + "Sent bit(1) NOT NULL,"
                + "Body text NOT NULL,"
                + "DATE datetime NOT NULL);";
        //execution des requetes
        db.execSQL(create_t_user);
        db.execSQL(create_t_friend_request);
        db.execSQL(create_t_friend);
        db.execSQL(create_t_message);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Supprimer les anciennes tables si elles existent
        // Requetes pou les suppressions
        String drop_t_user = "DROP TABLE IF EXISTS user";
        String drop_t_message = "DROP TABLE IF EXISTS message";
        String drop_t_friend = "DROP TABLE IF EXISTS friend";
        String drop_t_friend_request = "DROP TABLE IF EXISTS friend_request";
        // Suppression des tables
        db.execSQL(drop_t_user);
        db.execSQL(drop_t_message);
        db.execSQL(drop_t_friend);

        db.execSQL(drop_t_friend_request);
        // Create tables again
        onCreate(db);
    }

    //Les operation faites sur la bd "les CRUD"
    //Vider la base de donnée 
    public void empty() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete("user", null, null);
        db.delete("message", null, null);
        db.delete("friend", null, null);
        db.delete("friend_request", null, null);
        db.close();
    }
}

This is the log:

05-20 04:35:10.757: D/dalvikvm(3907): GC_EXTERNAL_ALLOC freed 458K, 55% free 3317K/7303K, 
external 1070K/1570K, paused 72ms
05-20 04:35:37.117: D/dalvikvm(3907): GC_CONCURRENT freed 435K, 47% free 3887K/7303K, 
external 1530K/2027K, paused 4ms+5ms
05-20 04:35:37.117: D/Cursor(3907): Database path: db_e_pal.db
05-20 04:35:37.117: D/Cursor(3907): Table name   : null
05-20 04:35:37.117: D/Cursor(3907): Database path: db_e_pal.db
05-20 04:35:37.117: D/Cursor(3907): Table name   : null

1 Answers1

-1
public class DbHelper extends SQLiteOpenHelper {

    // The Android's default system path of your application database.
    private static String PACKAGENAME = "com.xyz";
    private static String DB_PATH = "/data/data/" + PACKAGENAME + "/databases/";
    public static String DB_NAME = "abc.db";
    public static int DELETED = 1;
    public static int UPDATED = 2;
    public static int NEW_RECORD = 3;

    private static final String TAG = "DbHelper";
    private SQLiteDatabase myDataBase;

    private final Context myContext;

    /**
     * Constructor Takes and keeps a reference of the passed context in order to
     * access to the application assets and resources.
     * 
     * @param context
     */
    public DbHelper(final Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;

    }

    /**
     * Creates a empty database on the system and rewrites it with your own
     * database.
     * */
    public final void createDataBase() throws IOException {

        final boolean dbExist = checkDataBase();
        SQLiteDatabase db_Read = null;
        if (dbExist) {
             String create_t_user
                = "CREATE TABLE IF NOT EXISTS user ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "username varchar(20) NOT NULL,"
                + "password varchar(20) NOT NULL,"
                + "connected INTEGER(0) NOT NULL);";
        String create_t_friend_request
                = "CREATE TABLE IF NOT EXISTS friend_request ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "username varchar(20) NOT NULL,"
                + "ID_last_message INTEGER NOT NULL);";

        String create_t_friend
                = "CREATE TABLE IF NOT EXISTS friend ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "username varchar(20) NOT NULL," 
                + "connected INTEGER(0) NOT NULL);";

        String create_t_message
                = "CREATE TABLE IF NOT EXISTS message ("
                + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "ID_friend INTEGER NOT NULL,"
                + "Sent bit(1) NOT NULL,"
                + "Body text NOT NULL,"
                + "DATE datetime NOT NULL);";
        //execution des requetes
        db_Read .execSQL(create_t_user);
        db_Read .execSQL(create_t_friend_request);
        db_Read .execSQL(create_t_friend);
        db_Read .execSQL(create_t_message);
        } else {
            // By calling this method and empty database will be created into
            // the default system path
            // of your application so we are gonna be able to overwrite that
            // database with our database.
            // By calling this method and empty database will be created into
            // the default system path
            // of your application so we are gonna be able to overwrite that
            // database with our database.
            // db_Read = this.getReadableDatabase(DB_Internal);
            db_Read = this.getReadableDatabase();
            db_Read.close();

            copyDataBase();

        }
    }

    /**
     * Restore whole database without any data
     * 
     * @throws IOException
     */
    public final void RestoreDatabase() throws IOException {
        SQLiteDatabase db_Read = this.getReadableDatabase();
        db_Read.close();

        copyDataBase();
        Log.i(TAG, "Database REstored");
    }

    /**
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     * 
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase() {
        final File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();
    }

    /**
     * Copies your database from your local assets-folder to the just created
     * empty database in the system folder, from where it can be accessed and
     * handled. This is done by transfering bytestream.
     * 
     * @throws IOException
     * */
    private void copyDataBase() throws IOException {

        // Open your local db as the input stream
        final InputStream myInput = myContext.getAssets().open(DB_NAME);

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

        // Open the empty db as the output stream
        final OutputStream myOutput = new FileOutputStream(outFileName);

        // transfer bytes from the inputfile to the outputfile
        final 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 final SQLiteDatabase openDataBase() {
        // Open the database
        final String myPath = DB_PATH + DB_NAME;
        if (myDataBase != null && myDataBase.isOpen()) {
            myDataBase.close();
        }
        return myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);

    }

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

    @Override
    public void onCreate(final SQLiteDatabase arg0) {
    }

    @Override
    public void onUpgrade(final SQLiteDatabase arg0, final int arg1,
            final int arg2) {
    }

}

in your code you do not put code to create database (copy db from data/data/databases/ddd.db) so.you have to get this type of error..

please try this one.I hope its useful to you..

Xaver Kapeller
  • 49,491
  • 11
  • 98
  • 86
dipali
  • 10,966
  • 5
  • 25
  • 51
  • @Stephen **NEVER** alter code when editing an answer or question, formatting, spelling, grammar and generally cleaning up and making the post look nice is ok, but you are not supposed to change the intent of the post. You cannot just remove code, especially that much just because you feel that the code is unnecessary. And in this case it is anything but unnecessary and in fact it broke working code. I already rolled your edit back. – Xaver Kapeller Jun 23 '14 at 10:03