Загрузка данных из базы данных SQLite не работает - PullRequest
0 голосов
/ 03 июня 2018

У меня есть эта база данных с именем "TabliceBaza"

public class TabliceBaza extends SQLiteOpenHelper {

public static final String DATABASE_NAME="Tablica.db";
public static final String TABLE_NAME="Tablice_table";
public static final String COL1="_id";
public static final String COL2="Tablica";

public TabliceBaza(Context context) {
    super(context,DATABASE_NAME,null,1);
}

@Override
public void onCreate(SQLiteDatabase db) {

 db.execSQL("CREATE TABLE "+TABLE_NAME+"("+COL1+"INT PRIMARY KEY,"+COL2+"TEXT)");


}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

public String loadHandler()
{
    String result = "";
    String query = "SELECT * FROM "+TABLE_NAME;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    while (cursor.moveToNext()) {
        int result_0 = cursor.getInt(0);
        String result_1 = cursor.getString(1);

        result += String.valueOf(result_0) + " " + result_1 +
                System.getProperty("line.separator");
    }
    cursor.close();
    db.close();
    return result;

}
public void addHandler(Tablice tablice) {
    ContentValues values = new ContentValues();
    values.put(COL1, tablice.getTablicaID());
    values.put(COL2,tablice.getTablicaIme());
    SQLiteDatabase db = this.getWritableDatabase();
    db.insert(TABLE_NAME, null, values);
    db.close();
}

В классе активности я хочу показать все значения из моей базы данных и установить для него TextView


Вот код для ButtonClick в действии


   TabliceBaza tb=new TabliceBaza(this);
   TextView txt=(TextView)findViewById(R.id.textView3);

   Tablice t=new Tablice(1,"Misko00");
   tb.addHandler(t);
   txt.setText(tb.loadHandler());


Как вы можете видеть, когда я нажимаю на кнопку, он должен добавить "Tablice "объект в базе данных, а затем показать его, но он ничего не показывает.

1 Ответ

0 голосов
/ 03 июня 2018

Основная проблема, с которой вы столкнулись, заключается в том, что вы пропустили пробелы между именами столбцов и типами столбцов.Это будет работать, но приведет к тому, что имена столбцов будут объединены с указанным именем столбца с типом.Поэтому, когда вы запустите приложение, у вас будет таблица с именем Tablice_table , которая имеет имя из двух столбцов _idINT и TablicaTEXT .

Когда кнопкащелкнув, запись не будет вставлена, поскольку столбцы _id и Tablica не существуют.

Если вы заглянули в журнал, вы увидите что-то похожее на ( Обратите внимание, что это не приводит к сбою приложения ): -

06-03 20:29:56.109 1143-1143/soanswers.soanswers E/SQLiteLog: (1) table Tablice_table has no column named _id
06-03 20:29:56.109 1143-1143/soanswers.soanswers E/SQLiteDatabase: Error inserting _id=1 Tablica=Test
    android.database.sqlite.SQLiteException: table Tablice_table has no column named _id (code 1): , while compiling: INSERT INTO Tablice_table(_id,Tablica) VALUES (?,?)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
        at soanswers.soanswers.TabliceBaza.addHandler(TabliceBaza.java:56)
        at soanswers.soanswers.MainActivity$1.onClick(MainActivity.java:529)
        at android.view.View.performClick(View.java:4084)
        at android.view.View$PerformClick.run(View.java:16966)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

Исправление этой проблемы заключается в том, чтобы изменить код, включив в него пробелы при создании таблицы, например: -

db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + COL1 + " INT PRIMARY KEY," + COL2 + " TEXT)");

, а затем либо удалить данные приложения, либо удалить приложение.

После удаления данных приложения или повторного запуска приложения предоставленный код (после добавления пробелов в операторе создания таблицы) работает.

Однако, если вы нажметекнопку во второй раз, тогда вы увидите сообщение в журнале ( Опять же это не приводит к краху приложения ) по направлениям: -

06-03 20:38:24.451 1256-1256/soanswers.soanswers E/SQLiteDatabase: Error inserting _id=1 Tablica=Test
    android.database.sqlite.SQLiteConstraintException: column _id is not unique (code 19)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
        at soanswers.soanswers.TabliceBaza.addHandler(TabliceBaza.java:54)
        at soanswers.soanswers.MainActivity$1.onClick(MainActivity.java:529)
        at android.view.View.performClick(View.java:4084)
        at android.view.View$PerformClick.run(View.java:16966)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

Это связано с тем, что _id является первичным ключом и должен быть незаполненным, поэтому попытка добавить строку с _id как 1 снова не удастся.

...