web-dev-qa-db-fra.com

Problème Android SQLite - table ... n'a pas de colonne nommée

Je reçois cette erreur - 07-03 12:29:18.643: E/SQLiteLog(5181): (1) table accounts has no column named otherNotes

Ceci est mon code:

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "accountsManager";
private static final String TABLE_ACCOUNTS = "accounts";

private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_USERID = "userId";
private static final String KEY_PASSWORD = "password";
private static final String KEY_LOGINURL = "loginUrl";
private static final String KEY_OTHERNOTES = "otherNotes";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public void onCreate(SQLiteDatabase db) {
    String CREATE_ACCOUNTS_TABLE = "CREATE TABLE " + TABLE_ACCOUNTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT,"
            + KEY_USERID + " TEXT," + KEY_PASSWORD + " TEXT," + KEY_LOGINURL + " TEXT,"
            + KEY_OTHERNOTES + " TEXT" + ");";
db.execSQL(CREATE_ACCOUNTS_TABLE);
}


public void addAccount(AccountDetails account) {
    SQLiteDatabase db = this.getWritableDatabase();
    System.out.println("Hello!");   


    ContentValues values = new ContentValues();
    values.put(KEY_TITLE, account.getTitle()); // Account Title
    values.put(KEY_USERID, account.getUserId()); // account userid
    values.put(KEY_PASSWORD, account.getPassword()); // account password
    values.put(KEY_LOGINURL, account.getLoginUrl()); // account loginurl
    values.put(KEY_OTHERNOTES, account.getOtherNotes()); // account othernotes
    Log.v("title", KEY_TITLE);


    // Inserting Row
    db.insert(TABLE_ACCOUNTS, null, values);
    db.close(); // Closing database connection
}

Aussi, quand je supprime la déclaration suivante:

values.put(KEY_OTHERNOTES, account.getOtherNotes()); // account othernotes

Ensuite, je rencontre le même problème avec le mot de passe ... etc. .

S'il vous plaît aider!

32

Il semble que vous ayez ajouté des colonnes plus tard dans la base de données. Je suis d'accord avec Ken Wolf et vous devriez envisager de désinstaller et de réinstaller votre application. Une meilleure approche consiste à supprimer et à recréer toutes les tables dans la méthode onUpdate et à augmenter la version de la base de données chaque fois que vous modifiez le schéma. 

70
sachin garg

Eh bien, si vous avez des doutes sur la syntaxe de création d'une table, cela peut arriver Lorsque vous ajoutez une nouvelle colonne à votre même table, pour cela ...

1) Désactivez votre appareil et relancez-le.

OU 

2) Paramétrage -> application -> ClearData

OR

3) Modifiez DATABASE_NAME dans votre classe "DatabaseHandler" (J'ai rencontré le même problème. Mais j'ai provoqué en modifiant DATABASE_NAME.)

OR

4) Modifiez DATABASE_VERSION dans votre classe "DatabaseHandler" (Si vous avez ajouté une nouvelle colonne, celle-ci sera mise à niveau automatiquement)

public DatabaseHandler(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
13
Kush

Comme Benil le dit dans un commentaire ci-dessus , modifiez le numéro de version de la base de données et exécutez le code à nouveau.

4
user2241968

Le code SQL a l'air bien .. Je pense que vous avez oublié d'appeler open() sur votre objet de base de données que vous avez créé.

ajoutez ces méthodes à votre classe SQL:

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

public DataBaseMain open() throws SQLException{ 
    // Open the database to make her writeable, must be called before writing 
    // to database

    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close(){                
    // Closing the database for writing, avoids error.
    ourHelper.close();
}

Et utilisez quand vous voulez appeler votre DB.

4
dasdasd

Essayez "Effacer les données" de votre application à partir des paramètres. Pour moi, ce problème se posait car j’étais en train de stocker des données sur une carte SD et, plus tard, j’ai ajouté des colonnes. Donc, si vous enregistrez sur une carte SD, supprimez les données précédentes.

3
Ajji

J'ai rencontré le même problème en mettant à jour ma table de base de données dans SQLite avec de nouvelles colonnes au cours de la phase de test. 

Outre les réponses déjà données ci-dessus, ce que j’ai trouvé très utile pour mettre à jour les bases de données SQLite (par exemple, après des modifications) est ABD Idea , un plugin AndroidStudio qui vous permet de:

  1. Désinstaller l'application
  2. Élément de liste
  3. Kill App
  4. Démarrer l'application
  5. Redémarrer l'application
  6. Effacer les données de l'application
  7. Effacer les données de l'application et redémarrer
2
daniiielak

Il est possible que vous fassiez une erreur dans la requête de création et que vous le corrigiez ensuite,

Ainsi, dans le système de fichiers, vous avez une base de données, mais cette base de données n'a probablement pas cette colonne.

Solution: Dans l'émulateur, recherchez un fichier de base de données: data/data/com.somecompany.yourapp/database/db, supprimez-le, puis réessayez.

Il est également possible d'ouvrir ce fichier dans un explorateur SQL et de vérifier si cette colonne existe.

2
Andrey

Ici c'est votre requête..TRY ceci.

 String CREATE_ACCOUNTS_TABLE = "CREATE TABLE "+TABLE_ACCOUNTS+"(KEY_ID INTEGER PRIMARY KEY,KEY_TITLE TEXT,KEY_USERID TEXT,KEY_PASSWORD TEXT,KEY_LOGINURL TEXT,KEY_OTHERNOTES TEXT);";
2
Mit Bhatt

Vous pouvez simplement spécifier la version comme ceci:

private static final int VERSION = 4;
1
Utopia

Si vos codes sont OK, essayez simplement de désinstaller l’application, puis relancez-la une fois. Cela a résolu mon problème. J'espère que ça a aidé

1
Anyon

Pour ceux qui ont le même problème et dont la solution ci-dessus n'est pas résolue, cochez 2 choses:

  1. Espace entre le nom de la colonne et le type de données comme 

     COLUMN_NUMBER+" TEXT PRIMARY KEY) not  COLUMN_NUMBER+"TEXT PRIMARY KEY)
    
  2. L’ordre des colonnes lors de la création de la table doit être identique à celui de la carte pour l’insertion de données, comme 

    ContentValues values = new ContentValues();
    values.put(TEST_ID, testId);
    values.put(CLASS_NAME, className);
    values.put(SUBJECT, subject);
    
    "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + TEST_ID + " INTEGER,"
                + CLASS_NAME + " TEXT,"
                + SUBJECT + " TEXT,"
    
0
itin