Search code examples
androidsqliteopenhelpergetwritabledatabase

android getWritableDatabase() crashes


so I saw a lot of answers about this topic but neither worked or I didn't really understood what to do ! xD so if you answer by linking a topic that answers that fine !

I have a MainActivity where I display my stuff and all, and a class dbHandler.

In my dbHandler class some functions are calling getWritableDatabase() and when they are called in my MainActivity my app crashes :/, I saw that I shouldn't use it in dbHandler cause it can't be called recursivly blabla but I don't see where it is called recursivly... xD

Here is the MainActivity called Accueil there is more code but I cut useless code, and there should be words in french it's normal I do lot of frenglish xD

public class Accueil extends AppCompatActivity {
    TextView textDB;
    dbHandler db_handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accueil);

        textDB = (TextView) findViewById(R.id.textDB);
        db_handler = new dbHandler(this, null, null, 1);
        Alerte alerte = new Alerte("feu");
        db_handler.addAlerte(alerte);
        //printDatabase();

    }

    public void printDatabase(){
        String dbString = db_handler.databaseToString();
        textDB.setText(dbString);
    }
}

And the dbHandler

package com.example.yorokobii.popalerte;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class dbHandler extends SQLiteOpenHelper{

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "Alertes.db";
    public static final String TABLE_ALERTES = "Alertes";
    public static final String COLUMN_ID = "_id ";
    public static final String COLUMN_ALERTENAME = "alertename ";

    public dbHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE " + DATABASE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COLUMN_ALERTENAME + " TEXT "
                + ");";
        db.execSQL(query);/*

        ContentValues values = new ContentValues();
        values.put(COLUMN_ALERTENAME, "test");
        db.insert(TABLE_ALERTES, null, values);*/
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME);
        onCreate(db);
    }

    //fonction qui ajoute une alerte a la base de donnée
    public void addAlerte(Alerte alerte){
        ContentValues values = new ContentValues();
        values.put(COLUMN_ALERTENAME, alerte.get_alertename());
        SQLiteDatabase db = getWritableDatabase();
        db.insert(TABLE_ALERTES, null, values); //effectue la requète insert sur TABLE_ALERTES avec les valeur rentrées dans value
        db.close();
    }

    //fonction qui supprime une alerte en fonction de son nom (plus tard son état surement)
    public void deleteAlerte(String alertename){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_ALERTES + "WHERE " + COLUMN_ALERTENAME + "=\"" + alertename + "\";");
        db.close();
    }

    //fonction qui supprime toutes les alertes
    public void deleteAlerte(){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_ALERTES + "WHERE 1");
        db.close();
    }

    //fonction qui affiche les alertes dans une chaine de caractère
    public String databaseToString(){
        String dbString = "";
        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_ALERTES;

        //créé un cuseur pour la requète
        Cursor c = db.rawQuery(query, null);

        c.moveToFirst();//place le curseur a la premiere colonne du resultat de la requete

        while(!c.isAfterLast()){ //tant qu'il y a des resultats a traiter
            if(c.getString(c.getColumnIndex(COLUMN_ALERTENAME)) != null){ //si le nom de l'alerte n'est pas null on l'affiche
                dbString = c.getString(c.getColumnIndex(COLUMN_ALERTENAME));
                dbString += "\n";
            }
        }
        db.close();
        return dbString;
    }
}

LogCat

Caused by: android.database.sqlite.SQLiteException: unknown database Alertes (code 1): , while compiling: CREATE TABLE Alertes.db(_id INTEGER PRIMARY KEY AUTOINCREMENT, alertename TEXT );
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
at com.example.yorokobii.popalerte.dbHandler.onCreate(dbHandler.java:27)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.example.yorokobii.popalerte.Accueil.addAlerte(Accueil.java:173)
at com.example.yorokobii.popalerte.Accueil.onCreate(Accueil.java:115)
at android.app.Activity.performCreate(Activity.java:6237)

Solution

  • String query = "CREATE TABLE " + DATABASE_NAME + "("
    

    The database name is not the table name.