【问题标题】:App crashes without any changes done未进行任何更改的应用程序崩溃
【发布时间】:2018-11-08 05:23:55
【问题描述】:

此帖与Creating multiple Tables and inserting Data into them相关 所以我解决了我只创建一个表的问题。但是现在,当我尝试切换活动时,应用程序会崩溃。我的 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

提前感谢您的帮助!

【问题讨论】:

  • 你的 gradle 文件的内容是什么?你有像constraintlayout这样的依赖吗?
  • How to Ask。以文本形式向我们显示崩溃信息。

标签: android android-studio android-activity


【解决方案1】:

此异常的原因是您在创建表时对列有除?? 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_LINTEGER 之间添加了一个空格,因此 ID_LINTEGER 变为 ID_L INTEGER

说您使用AUTOINCREMENT 很可能是不必要的,而且是有害的,因为它会消耗更多资源。

AUTOINCREMENT 所做的只是确保下一个 id 大于前一个(在达到 9223372036854775807 行之前,它很可能会一直如此)。如果使用AUTOINCREMENT 达到该数字,您将无法插入行,因为插入将有 SQLITE_FULL 异常。同时,如果没有AUTOINCREMENT,可能会分配一个现在未使用的 id。

引用 SQLIte 文档:-

  1. AUTOINCREMENT 关键字强加了额外的 CPU、内存、磁盘空间和 磁盘 I/O 开销,如果不是严格需要,应该避免。它是 通常不需要。

  2. 在 SQLite 中,类型为 INTEGER PRIMARY KEY 的列是 ROWID(除了 WITHOUT ROWID 表),它始终是 64 位有符号的 整数。

  3. 在 INSERT 上,如果 ROWID 或 INTEGER PRIMARY KEY 列不是 显式给定一个值,然后它将自动填充 未使用的整数,通常比当前最大的 ROWID 大一 采用。无论 AUTOINCREMENT 是否 使用关键字。

  4. 如果 AUTOINCREMENT 关键字出现在 INTEGER PRIMARY KEY 之后,则 更改自动 ROWID 分配算法以防止重用 数据库生命周期内的 ROWID 数。换句话说, AUTOINCREMENT 的目的是防止重复使用 ROWID 以前删除的行。

因此我建议使用:-

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

【讨论】:

  • 非常感谢您的帮助。如果它对你没问题,我现在有另一个问题:)。在表中插入数据时,我得到一个崩溃信息,表中没有列。
  • 您是否(您能承受丢失现有数据的后果)删除应用程序的数据(设置/应用程序清除/删除数据)并重新运行?未找到列的一个非常常见的原因,因为 onCreate 方法仅在首次创建数据库时运行。
  • 谢谢大家,特别是 @MikeT 帮助我的代码现在可以正常工作。
  • @jungWombat 太好了,你能把问题打勾吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多