getReadableDatabase 处的 IllegalStateException

IllegalStateException at getReadableDatabase

我有一个带有 sqlite 数据库的 android 项目。直到昨天一切正常,但现在,我收到以下错误:

FATAL EXCEPTION: main Process: com.jurtz.android.ichhabnochnie, PID: 7720    
java.lang.RuntimeException: Unable to resume activity {com.jurtz.android.ichhabnochnie/com.jurtz.android.ichhabnochnie.customEntryActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                               at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
                                                                               at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                            Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                               at android.database.CursorWindow.nativeGetString(Native Method)
                                                                               at android.database.CursorWindow.getString(CursorWindow.java:438)
                                                                               at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
                                                                               at com.jurtz.android.ichhabnochnie.database.databaseManager.onUpgrade(databaseManager.java:69)
                                                                               at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
                                                                               at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
                                                                               at com.jurtz.android.ichhabnochnie.customEntryActivity.onResume(customEntryActivity.java:106)
                                                                               at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                                                                               at android.app.Activity.performResume(Activity.java:6327)
                                                                               at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                                                                               at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134) 
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:148) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

在以下 class 中调用 getReadableDatabase 时出现此错误:

public class customEntryActivity extends AppCompatActivity {

  TextView lblCustomEntryInfo;
  Button cmdEnterCustomEntry;
  Button cmdCancelCustomEntry;
  EditText txtCustomEntry;
  RelativeLayout customEntryActivityLayout;
  Activity activity;

  private SQLiteDatabase db;
  private databaseManager dbManager;

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

    dbManager = new databaseManager(this);

    activity = this;
    customEntryActivityLayout = (RelativeLayout)findViewById(R.id.customEntryActivityLayout);
    customEntryActivityLayout.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        View view = activity.getCurrentFocus();
        if (view == null) {
          view = new View(activity);
        }
        imm.hideSoftInputFromWindow(view.getWindowToken(),0);
      }
    });

    lblCustomEntryInfo = (TextView)findViewById(R.id.lblCustomEntryInfo);
    lblCustomEntryInfo.setText("Ich hab noch nie...");

    cmdCancelCustomEntry = (Button)findViewById(R.id.cmdCustomEntryCancel);
    cmdCancelCustomEntry.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        db.close();
        finish();
      }
    });

    cmdEnterCustomEntry = (Button)findViewById(R.id.cmdCustomEntryEnter);
    cmdEnterCustomEntry.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (txtCustomEntry.getText().toString().length() > 0) {

          Date today = new Date();
          String text = txtCustomEntry.getText().toString().replace("'","\'");
          Message msg = new Message(txtCustomEntry.getText().toString(), today, "CUSTOM");
          String sql = MessageHelper.getInputCommand(msg, databaseManager.getTableName());
          try {
            db.execSQL(sql);
            Toast.makeText(getApplicationContext(), "Eintrag hinzugefügt", Toast.LENGTH_SHORT).show();
          } catch (SQLException sqlEx) {
            Toast.makeText(getApplicationContext(), "Fehler beim Eintrag in die Datenbank", Toast.LENGTH_SHORT).show();
          }

          txtCustomEntry.setText("");
        } else {
           Toast.makeText(getApplicationContext(),"Keine Eingabe vorhanden",Toast.LENGTH_SHORT).show();
        }
      }
    });

    txtCustomEntry = (EditText)findViewById(R.id.txtCustomEntry);

  }

  // DB-Methoden
  @Override
  protected void onPause() {
    super.onPause();
    db.close();
  }

  @Override
  protected void onResume() {
    super.onResume();
    db = dbManager.getReadableDatabase();
    // Toast.makeText(getApplicationContext(),"DB geöffnet",Toast.LENGTH_LONG).show();
  }
}

我看到有些人遇到了类似的问题,但我目前不知道错误来自哪里以及导致错误的原因...

数据库管理器:

public class databaseManager extends SQLiteOpenHelper {

private static final String dbName = "db_IchHabNochNie";
// version 9: Update 12.7.
private static final int dbVersion = 11;

private static final String tableName = "message";
private static final String createTable = "CREATE TABLE "+tableName+"(" +
            "text VARCHAR(100) PRIMARY KEY, " +
            "author VARCHAR(6), " +
            "date_added VARCHAR(10)" +
        ");";

private static final String dropTable = "DROP TABLE IF EXISTS "+tableName+";";

public static final String SELECT_USER_MESSAGES = "SELECT text FROM "+tableName+" WHERE author='CUSTOM';";
public static final String SELECT_SYSTEM_MESSAGES = "SELECT text FROM "+tableName+" WHERE author='SYSTEM';";
public static final String SELECT_ALL_MESSAGES = "SELECT text FROM "+tableName+";";

public databaseManager(Context context) {
    super(context,dbName,null,dbVersion);
}

public databaseManager(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(createTable);

    HashSet<Message> messages = MessageHelper.getMessages();
    for(Message msg : messages) {
        db.execSQL(MessageHelper.getInputCommand(msg,tableName));
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Backup and Re-Insert CUSTOMs
    ArrayList<Message> customs = new ArrayList<>();
    boolean customsExist = false;
    Cursor c = db.rawQuery(SELECT_USER_MESSAGES, null);
    if(c.getCount() > 0) {
        customsExist = true;
        String text;
        String author;
        String date;
        if (c.moveToFirst()) {
            while (c.isAfterLast() == false) {
                text = c.getString(c.getColumnIndex("text"));
                date = c.getString(c.getColumnIndex("date_added"));
                author = c.getString(c.getColumnIndex("author"));
                Message msg = new Message(text, date, author);
                customs.add(msg);
                c.moveToNext();
            }
        }
    }
    db.execSQL(dropTable);
    db.execSQL(createTable);
    if(customsExist) {
        // Einträge wieder einfügen
        for(int i = 0; i<customs.size(); i++) {
            String sql = MessageHelper.getInputCommand(customs.get(i),tableName);
            try {
                db.execSQL(sql);
            } catch (SQLException sqlEx) {
                // To be implemented
            }
        }
    }

    HashSet<Message> messages = MessageHelper.getMessages();
    for(Message msg : messages) {
        db.execSQL(MessageHelper.getInputCommand(msg,tableName));
    }
}
public static String getTableName() {
    return tableName;
}

}

谢谢!

您的结果集中没有 date_added 列。当您调用 getColumnIndex()Cursor 找不到它,返回 -1