【问题标题】:Android SQLite Database CrashingAndroid SQLite 数据库崩溃
【发布时间】:2014-11-10 20:46:34
【问题描述】:

我正在尝试在 android 中创建一个 sqlite 数据库来备份文本。这是我第一次使用 sqlite 数据库,所以我是个菜鸟。尝试打开数据库时崩溃并在日志中抛出这些错误

java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:3591)
            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)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at android.view.View$1.onClick(View.java:3586)
            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)
     Caused by: java.lang.IllegalArgumentException: Version must be >= 1, was -1669636
            at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:100)
            at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:78)
            at com.swavey.testing.smsDatabase$DatabaseHelper.<init>(smsDatabase.java:115)
            at com.swavey.testing.smsDatabase.<init>(smsDatabase.java:82)
            at com.swavey.testing.MainActivity.Backup(MainActivity.java:44)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at android.view.View$1.onClick(View.java:3586)
            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)

这是我的主要活动中的代码

SimpleCursorAdapter adapter;
private smsDatabase db1;

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





}

public void Backup(View view) {

    Uri convo = Uri.parse("content://sms");
    String[] reqCol = new String[] {"_id", "thread_id", "address", "person", "date", "body", "type"};
    ContentResolver contentResolver = getContentResolver();
    Cursor c = contentResolver.query(convo, null, null, null, "date asc");
    SMSList<SMS> smsList = new SMSList<SMS>();
    String count = Integer.toString(c.getCount());
    Log.d("Count",count);
    Context ctx = getApplicationContext();
    db1 = new smsDatabase(ctx);
    db1.open();
    while (c.moveToNext()) {
        SMS txt = new SMS();

        long dateLong = c.getLong(c.getColumnIndex("date"));
        Integer id1 = c.getInt(c.getColumnIndex("_id"));
        String body = c.getString(c.getColumnIndex("body"));
        Integer type1 = c.getInt(c.getColumnIndex("type"));
        String address1 = c.getString(c.getColumnIndex("address"));
        String read1 = c.getString(c.getColumnIndex("read"));
        String seen1 = c.getString(c.getColumnIndex("seen"));
        String subject1 = c.getString(c.getColumnIndex("subject"));
        smsList.add(txt);

        db1.insertSMS(txt);

    }
}

以及我的 sqlite 数据库中的代码

package com.swavey.testing;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.security.KeyChain;

import java.util.Date;

/**
 * Created by Adrian on 11/5/2014.
 */
public class smsDatabase  {

    private static final String KEY_ID = "_id";
    private static final int COLUMN_ID =0;

    // database info
    public static final String DATABASE_NAME = "texts";
    public static final String DATABASE_TABLE = "mainTable";
    public static final int DATABASE_VERSION = (int) new Date().getTime()/1000;

    // list of fields
    private static final String KEY_ADDRESS = "address";
    private static final String KEY_BODY = "body";
    private static final String KEY_DATE = "date";
    private static final String KEY_DATESENT = "dateSent";
    private static final String KEY_READ = "read";
    private static final String KEY_SUBJECT = "subject";
    private static final String KEY_THREADID = "thread_id";
    private static final String KEY_PERSON = "person";
    private static final String KEY_PROTOCOL = "protocol";
    private static final String KEY_TYPE = "type";
    private static final String KEY_SERVICECENTER = "serviceCenter";

    //list of field numbers
    private static final int COL_ADDRESS = 1;
    private static final int COL_BODY = 2;
    private static final int COL_DATE = 3;
    private static final int COL_DATESENT = 4;
    private static final int COL_READ = 5;
    private static final int COL_SUBJECT = 6;
    private static final int COL_THREADID = 7;
    private static final int COL_PERSON = 8;
    private static final int COL_PROTOCOL = 9;
    private static final int COL_TYPE = 10;
    private static final int COL_SERVICECENTER = 11;

    //create string array of all fields;
    public static final String[] ALL_KEYS = new String[] {KEY_ID, KEY_ADDRESS, KEY_BODY, KEY_DATE,
        KEY_DATESENT, KEY_PERSON, KEY_PROTOCOL,KEY_READ, KEY_SERVICECENTER, KEY_SUBJECT,
        KEY_THREADID, KEY_TYPE};


    private static final String DATABASE_CREATE_SQL = "create table " + DATABASE_TABLE
            + " (" + KEY_ID + " integer primary key autoincrement, "
            +KEY_ADDRESS + " text not null, "
            +KEY_BODY + " text not null, "
            +KEY_DATE + " text not null, "
            +KEY_DATE + " text not null, "
            +KEY_PERSON+ " text not null, "
            +KEY_PROTOCOL+ " text not null, "
            +KEY_READ+ " text not null, "
            +KEY_PERSON + " text not null, "
            +KEY_PROTOCOL+ " text not null, "
            +KEY_READ+ " text not null, "
            +KEY_SERVICECENTER+ " text not null, "
            +KEY_SUBJECT+ " text not null, "
            +KEY_THREADID+ " text not null, "
            +KEY_TYPE+ " text not null"
            + ");";

    private final Context context;

    private DatabaseHelper dbHelper;
    private SQLiteDatabase db;

    public smsDatabase (Context cxt) {
        this.context = cxt;
        dbHelper = new DatabaseHelper(context);
    }

    //open database
    public smsDatabase open() {
        db = dbHelper.getWritableDatabase();
        return this;
    }
    //close database
    public void close() {
        dbHelper.close();
    }

    // insert sms into table
    public long insertSMS (SMS sms) {
        ContentValues iv = new ContentValues();
        iv.put(KEY_ADDRESS, sms.getAddress());
        iv.put(KEY_BODY, sms.getBody());
        iv.put(KEY_DATE, sms.getDate());
        iv.put(KEY_DATESENT, sms.getDateSent());
        iv.put(KEY_PERSON, sms.getPerson());
        iv.put(KEY_PROTOCOL, sms.getProtocol());
        iv.put(KEY_READ, sms.getRead());
        iv.put(KEY_SERVICECENTER, sms.getServiceCenter());
        iv.put(KEY_SUBJECT, sms.getSubject());
        iv.put(KEY_THREADID, sms.getThread_id());
        iv.put(KEY_TYPE, sms.getType());

        return db.insert(DATABASE_TABLE, null,iv);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        public void onCreate(SQLiteDatabase _db) {
            _db.execSQL(DATABASE_CREATE_SQL);
        }


        public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
            _db.execSQL("DROP TABLE IF EXISTS "+ DATABASE_TABLE);
            onCreate(_db);
        }
    }
}

【问题讨论】:

  • Stacktrace 告诉您,您正试图在 com.swavey.testing.MainActivity.Backup(MainActivity.java:42) 的第 42 行访问空对象的属性或方法。你有没有调试看看什么对象是空的?我的猜测是 db1 从未实例化/初始化。
  • 我解决了这个问题。现在我仍然收到错误。数据库助手类中似乎有问题

标签: android android-sqlite


【解决方案1】:

首先我可以看到你没有初始化你的 db1 可能有其他错误修复这个然后我们可以看到更多。

public void Backup(View view) {

    Uri convo = Uri.parse("content://sms");
    String[] reqCol = new String[] {"_id", "thread_id", "address", "person", "date", "body", "type"};
    ContentResolver contentResolver = getContentResolver();
    Cursor c = contentResolver.query(convo, null, null, null, "date asc");
    SMSList<SMS> smsList = new SMSList<SMS>();
    String count = Integer.toString(c.getCount());
    Log.d("Count",count);
    db1.open();**//this is null**

.

【讨论】:

    【解决方案2】:

    这可能会也可能不会完全解决您的问题,但您似乎多了一个分号

    private static final String DATABASE_CREATE_SQL = "create table " + DATABASE_TABLE
                + " (" + KEY_ID + " integer primary key autoincrement, "
                +KEY_ADDRESS + " text not null, "
                +KEY_BODY + " text not null, "
                +KEY_DATE + " text not null, "
                +KEY_DATE + " text not null, "
                +KEY_PERSON+ " text not null, "
                +KEY_PROTOCOL+ " text not null, "
                +KEY_READ+ " text not null, "
                +KEY_PERSON + " text not null, "
                +KEY_PROTOCOL+ " text not null, "
                +KEY_READ+ " text not null, "
                +KEY_SERVICECENTER+ " text not null, "
                +KEY_SUBJECT+ " text not null, "
                +KEY_THREADID+ " text not null, "
                +KEY_TYPE+ " text not null"
                + ");";
                    ^take this out
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多