не может вставить значения в таблицу SQLite - PullRequest
0 голосов
/ 04 января 2019

Мне трудно понять, почему я получаю ошибку при вставке значений в таблицу.благодарю за помощь.

Я проверил запрос SQlite и т. Д.

package com.avrahamzilberblat.battleshipfinal;

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

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TAG = "DatabaseHelper";
    private static final String TABLE_NAME = "people_table";
    private static final String COL1 = "ID";
    private static final String COL2 = "name";
    private static final String COL3 = "scoreRatio";

    public DatabaseHelper(Context context) {

        super(context, TABLE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +COL2 +" TEXT,"+ COL3 +"INTEGER"+");";
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COL2 +" TEXT,"+COL3+"TEXT)");



    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public boolean addData(String item,int scoreRatio) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, item);
        contentValues.put(COL3, 5);


        long result = db.insert(TABLE_NAME, null, contentValues);

        //if date as inserted incorrectly it will return -1
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Returns all the data from database
     * @return
     */
    public Cursor getData(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME;
        Cursor data = db.rawQuery(query, null);
        return data;
    }

    /**
     * Returns only the ID that matches the name passed in
     * @param name
     * @return
     */
    public Cursor getItemID(String name,Double scoreRatio){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT " + COL1 + " FROM " + TABLE_NAME +
                " WHERE " + COL2 + " = '" + name + "'" + " AND " +COL3 + " = '" + scoreRatio+"'";
        Cursor data = db.rawQuery(query, null);
        return data;
    }

    /**
     * Updates the name field
     * @param newName
     * @param id
     * @param oldName
     */
    public void updateName(String newName, int id, String oldName){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "UPDATE " + TABLE_NAME + " SET " + COL2 +
                " = '" + newName + "' WHERE " + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + oldName + "'";
        Log.d(TAG, "updateName: query: " + query);
        Log.d(TAG, "updateName: Setting name to " + newName);
        db.execSQL(query);
    }

    /**
     * Delete from database
     * @param id
     * @param name
     */
    public void deleteName(int id, String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + name + "'";
        Log.d(TAG, "deleteName: query: " + query);
        Log.d(TAG, "deleteName: Deleting " + name + " from database.");
        db.execSQL(query);
    }
    public void clearDatabase(String TABLE_NAME) {
        SQLiteDatabase db = this.getWritableDatabase();
        String clearDBQuery = "DELETE FROM "+TABLE_NAME;
        db.execSQL(clearDBQuery);
    }

}

-------------------- Это обновление яхотите строку и двойной тип данных, все еще не работает

@Override
public void onCreate(SQLiteDatabase db) {
    //String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +COL2 +" TEXT,"+ COL3 +"INTEGER"+");";
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL2 +" TEXT,"+COL3 +"REAL);");



}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean addData(String item,int scoreRatio) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, "ood");
    contentValues.put(COL3, 6.6);

1 Ответ

0 голосов
/ 04 января 2019

Вы должны изменить: -

db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL2 +" TEXT,"+COL3+"TEXT)");

на: -

db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY, " +
            COL2 +" TEXT,"+COL3+" TEXT)");

Затем выполните одно из следующих действий: -

  1. Удалить (Очистите) данные приложения из настроек / приложений.
  2. удалите приложение.
  3. Увеличьте версию базы данных, например, измените super(context, TABLE_NAME, null, 1); на super(context, TABLE_NAME, null, 2);

    , а затемперезапустите приложение.

Вышеуказанное важно, поскольку onCreate запускается автоматически только один раз при создании базы данных, что, возможно, является основной причиной вашей проблемы.Вы добавили столбец, но на самом деле он не был добавлен.

Я много играл с ним, я действительно хочу, чтобы это было реальное число, такое как Double, поэтому в началея написал REAL вместо TEXT

SQlite позволяет хранить данные любого типа в любом типе столбца с одним исключением, и это псевдоним rowid (столбец, определенный с помощью INTEGER PRIMARY KEY(с или без AUTOINCREMENT)).Псевдоним rowid может хранить только целое число (64-разрядное со знаком), и оно должно быть уникальным в таблице.

  • Примечание AUTOINCREMENT было опущено.Вы, скорее всего, не нуждаетесь в этом, и у него есть накладные расходы

Автоинкремент SQLite

, который включает в себя: -

AUTOINCREMENTКлючевое слово накладывает дополнительную нагрузку на процессор, память, дисковое пространство и дисковый ввод-вывод, и его следует избегать, если в этом нет особой необходимости.Обычно это не нужно.

...