Приложение вылетает без каких-либо изменений - PullRequest
0 голосов
/ 29 мая 2018

Эта публикация связана с Создание нескольких таблиц и вставка в них данных Так что я исправил проблему, связанную с созданием только одной таблицы.Но теперь приложение зависает, когда я пытаюсь сменить деятельность.Моя MainActivity все еще работает.

Это один из классов / действий, который вылетает.Другой аналогичен, единственными отличиями являются названия кнопок и текстовых сообщений.

public class FachErstellen extends AppCompatActivity {

DatabaseHelper myDb;
EditText editTextFachName;
EditText editTextFachKuerzel;
EditText editTextFachRaum;
EditText editTextFachLehrer;
Button buttonFachSpeichern;








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

    myDb = new DatabaseHelper(this);
    myDb.fuegeNeueTabellenHinzu();
    editTextFachName = (EditText) findViewById(R.id.editTextFachName);
    editTextFachKuerzel = (EditText) findViewById(R.id.editTextFachKuerzel);
    editTextFachRaum = (EditText) findViewById(R.id.editTextFachRaum);
    editTextFachLehrer = (EditText) findViewById(R.id.editTextFachLehrer);
    buttonFachSpeichern = (Button) findViewById(R.id.buttonFachSpeichern);

    addFach();
    zeigeFaecher();


}

public void addFach(){
    buttonFachSpeichern.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            boolean istGespeichert = myDb.speichereFach(editTextFachName.getText().toString(),
                    editTextFachKuerzel.getText().toString(),
                    editTextFachRaum.getText().toString(),
                    editTextFachLehrer.getText().toString());
            if (istGespeichert==true){
                Toast.makeText(FachErstellen.this, "Fach wurde gespeichert.", Toast.LENGTH_LONG).show();
            }
            else {
                Toast.makeText(FachErstellen.this, "Fach konnte nicht gespeichert werden.", Toast.LENGTH_LONG).show();
            }
        }
    });

}

public void zeigeFaecher(){
    buttonFaecherAnzeigen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Cursor res = myDb.zeigeFaecher();
            if (res.getCount() == 0) {
                zeigeNachricht("Fehler", "Keine Fächer gefunden");
                return;
            }

            StringBuffer buffer = new StringBuffer();
            while (res.moveToNext()){
                buffer.append("ID:" + res.getString(0)+"\n");
                buffer.append("Fach: " + res.getString(1)+"\n");
                buffer.append("Kürzel: " + res.getString(2)+"\n");
                buffer.append("Raum: " + res.getString(3)+"\n");
                buffer.append("Lehrer: " + res.getString(4)+"\n\n");
            }

            zeigeNachricht("Fächer", buffer.toString());
        }
    });
}

public void zeigeNachricht(String title, String Nachricht){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(Nachricht);
    builder.show();

}

- и следующий за файлом Gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

-

и информация о сбое

    Increasing code cache capacity to 128KB
05-29 15:15:28.150 15952-15952/jannikokan.de.stundenplan D/MeineAPP: DB angelegt
05-29 15:15:28.154 15952-15952/jannikokan.de.stundenplan E/SQLiteLog: (1) AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
05-29 15:15:28.154 15952-15952/jannikokan.de.stundenplan D/AndroidRuntime: Shutting down VM
05-29 15:15:28.155 15952-15952/jannikokan.de.stundenplan E/AndroidRuntime: FATAL EXCEPTION: main
    Process: jannikokan.de.stundenplan, PID: 15952
    java.lang.RuntimeException: Unable to start activity ComponentInfo{jannikokan.de.stundenplan/jannikokan.de.stundenplan.LehrerErstellen}: android.database.sqlite.SQLiteException: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: create table Lehrer_table(ID_LINTEGER PRIMARY KEY AUTOINCREMENT,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
     Caused by: android.database.sqlite.SQLiteException: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: create table Lehrer_table(ID_LINTEGER PRIMARY KEY AUTOINCREMENT,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
        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.executeSql(SQLiteDatabase.java:1677)
        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1608)
        at jannikokan.de.stundenplan.DatabaseHelper.CheckeUndErstelleTabelle(DatabaseHelper.java:114)
        at jannikokan.de.stundenplan.DatabaseHelper.erstelleTabellenDieNichtExistieren(DatabaseHelper.java:98)
        at jannikokan.de.stundenplan.DatabaseHelper.fuegeNeueTabellenHinzu(DatabaseHelper.java:80)
        at jannikokan.de.stundenplan.LehrerErstellen.onCreate(LehrerErstellen.java:36)
        at android.app.Activity.performCreate(Activity.java:6662)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
05-29 15:15:28.155 1595-1606/? W/ActivityManager:   Force finishing activity jannikokan.de.stundenplan/.LehrerErstellen
05-29 15:15:28.158 1595-1606/? W/ActivityManager:   Force finishing activity jannikokan.de.stundenplan/.SliderActivityActivity
05-29 15:15:28.196 1595-1636/? I/OpenGLRenderer: Initialized EGL, version 1.4
05-29 15:15:28.196 1595-1636/? D/OpenGLRenderer: Swap behavior 1
05-29 15:15:28.196 1595-1636/? W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
05-29 15:15:28.196 1595-1636/? D/OpenGLRenderer: Swap behavior 0
05-29 15:15:28.200 1595-1636/? D/EGL_emulation: eglCreateContext: 0xa350f6c0: maj 2 min 0 rcv 2
05-29 15:15:28.211 1595-1636/? D/EGL_emulation: eglMakeCurrent: 0xa350f6c0: ver 2 0 (tinfo 0x974e53b0)
05-29 15:15:28.218 1595-1636/? D/EGL_emulation: eglMakeCurrent: 0xa350f6c0: ver 2 0 (tinfo 0x974e53b0)
05-29 15:15:28.660 1595-1608/? W/ActivityManager: Activity pause timeout for ActivityRecord{17375b u0 jannikokan.de.stundenplan/.LehrerErstellen t103 f}
05-29 15:15:28.779 1996-2119/? D/EGL_emulation: eglMakeCurrent: 0xa5e052a0: ver 2 0 (tinfo 0xa5e03630)
05-29 15:15:29.294 1996-2119/? W/OpenGLRenderer: Incorrectly called buildLayer on View: ShortcutAndWidgetContainer, destroying layer...
05-29 15:15:31.327 1353-1378/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 7930259 , only wrote 7777440

Спасибо за помощь заранее!

1 Ответ

0 голосов
/ 30 мая 2018

Причиной этого исключения является то, что у вас есть что-то отличное от ?? INTEGER PRIMARY KEY AUTOINCREMENT для столбца при создании таблицы.

Более конкретно, у вас есть: -

create table Lehrer_table(ID_LINTEGER PRIMARY KEY AUTOINCREMENT,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)

Это должно быть вероятнобыть: -

create table Lehrer_table(ID_L INTEGER PRIMARY KEY AUTOINCREMENT,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)

т.е. был добавлен пробел между ID_L и INTEGER, поэтому ID_LINTEGER становится ID_L INTEGER.

Сказать, что вы используете AUTOINCREMENT, скорее всего, не нужно и вредно, поскольку оно потребляет больше ресурсов.

Все, что делает AUTOINCREMENT, - это гарантирует, чтоnext id будет больше, чем предыдущее (скорее всего, оно будет в любом случае, пока вы не достигнете 9223372036854775807 строк).Если это число будет достигнуто с AUTOINCREMENT, вы не сможете вставить строки, так как вставка будет иметь исключение SQLITE_FULL .Хотя есть вероятность, что без AUTOINCREMENT будет назначен теперь неиспользуемый идентификатор.

Чтобы процитировать документацию SQLIte: -

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

  2. В SQLite столбец с типом INTEGER PRIMARY KEY является псевдонимом для ROWID (кроме таблиц WITHOUT ROWID), который всегда представляет собой 64-разрядное целое число со знаком.

  3. В INSERT, если столбцу ROWID или INTEGER PRIMARY KEY явно не дано значение, он будет автоматически заполнен неиспользуемым целым числом, обычно на единицу больше, чем наибольший ROWIDВ настоящее время используется.Это верно независимо от того, используется или нет ключевое слово AUTOINCREMENT.

  4. Если ключевое слово AUTOINCREMENT появляется после INTEGER PRIMARY KEY, это изменяет алгоритм автоматического назначения ROWID, чтобы предотвратить повторное использование ROWIDs болеевремя жизни базы данных.Другими словами, целью AUTOINCREMENT является предотвращение повторного использования ROWID из ранее удаленных строк.

Поэтому я бы предложил использовать: -

create table Lehrer_table(ID_L INTEGER PRIMARY KEY,LEHRERNAMETEXT,LEHRERKUERZELTEXT,LEHRERRAUMTEXT,LEHRERMAILTEXT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...