简体   繁体   English

尝试连接到SQLite数据库时Android应用程序崩溃

[英]Android app crashes when trying to connect to SQLite database

my android app crashes and shows this error. 我的Android应用程式当机,并显示此错误。

package com.example.sanket.databaseexample;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.StrictMode;

/**
 * Created by sanket on 18-07-2017.
 */

public class DBHandler extends SQLiteOpenHelper{
    private static  final int DATABASE_VERSION =1;
    private static final String DATABASE_NAME = "products.db";
    public static final String TABLE_PRODUCTS = "products";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_PRODUCTNAME = "product_name";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query ="CREATE TABLE " + TABLE_PRODUCTS + "("  +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT ,"+
                COLUMN_PRODUCTNAME + " TEXT "+
                ")";
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP  TABLE IF EXISTS " + TABLE_PRODUCTS );
            onCreate(db);
    }
    public void addProduct(Products product){
        ContentValues values = new ContentValues();
        values.put(COLUMN_PRODUCTNAME,product.getProduct_name());
        SQLiteDatabase db = getWritableDatabase();
        db.insert(TABLE_PRODUCTS,null,values);
        db.close();
    }
    public void deleteProduct(String prductName){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_PRODUCTS + " WHERE " + COLUMN_PRODUCTNAME+ " =\"" + prductName + "\";");
    }
    public String databaseToString(){
        String dbString = "";
        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_PRODUCTS +" WHERE 1";
        Cursor c = db.rawQuery(query,null);
        if(c.getCount() > 0) {
            c.moveToFirst();
            while (!c.isAfterLast()) {
                if (c.getString(c.getColumnIndex("productname")) != null) {
                    dbString += c.getString(c.getColumnIndex("productname"));
                    dbString += "\n";
                }
            }
        }
        db.close();
        return dbString;
    }
}

LOG: 日志:

07-19 00:13:34.764 18415-18415/? 07-19 00:13:34.764 18415-18415 /? I/art: Not late-enabling -Xcheck:jni (already on) 07-19 00:13:34.765 18415-18415/? I / art:不是延迟启用-Xcheck:jni(已启用)07-19 00:13:34.765 18415-18415 /? W/art: Unexpected CPU variant for X86 using defaults: x86 07-19 00:13:35.243 18415-18415/com.example.sanket.databaseexample W/System: ClassLoader referenced unknown path: /data/app/com.example.sanket.databaseexample-2/lib/x86 07-19 00:13:35.501 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 7.283ms 07-19 00:13:35.506 18415-18415/com.example.sanket.databaseexample W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 07-19 00:13:35.992 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 7.732ms 07-19 00:13:36.142 18415-18415/com.example.sanket.databaseexample E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow W / art:使用默认值的X86出现意外的CPU变体:x86 07-19 00:13:35.243 18415-18415 / com.example.sanket.databaseexample W / System:ClassLoader引用的未知路径:/data/app/com.example。 sanket.databaseexample-2 / lib / x86 07-19 00:13:35.501 18415-18422 / com.example.sanket.databaseexample W / art:挂起所有线程:7.283ms 07-19 00:13:35.506 18415-18415 /com.example.sanket.databaseexample W / art:在Android 4.1之前,方法android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter,android.content.res.ColorStateList,android。 graphics.PorterDuff $ Mode)将错误地覆盖android.graphics.drawable.Drawable 07-19 00:13:35.992 18415-18422 / com.example.sanket.databaseexample中的package-private方法W / art:暂停所有线程:7.732ms 07-19 00:13:36.142 18415-18415 / com.example.sanket.databaseexample E / CursorWindow:无法从CursorWindow读取第0行,第-1列 which has 1 rows, 2 columns. 有1行2列 07-19 00:13:36.143 18415-18415/com.example.sanket.databaseexample D/AndroidRuntime: Shutting down VM 07-19 00:13:36.143 18415-18415 / com.example.sanket.databaseexample D / AndroidRuntime:关闭VM

--------- beginning of crash 07-19 00:13:36.148 18415-18415/com.example.sanket.databaseexample E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.sanket.databaseexample, PID: 18415 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sanket.databaseexample/com.example.sanket.databaseexample.MainActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. ---------崩溃开始07-19 00:13:36.148 18415-18415 / com.example.sanket.databaseexample E / AndroidRuntime:致命例外:主进程:com.example.sanket.databaseexample,PID :18415 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.sanket.databaseexample / com.example.sanket.databaseexample.MainActivity}:java.lang.IllegalStateException:无法从中读取第0行,列-1 CursorWindow。 Make sure the Cursor is initialized correctly before accessing data from it. 在从游标访问数据之前,请确保正确初始化了游标。 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: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)在android.app.ActivityThread.-wrap12(ActivityThread.java)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460)在android.os.Handler.dispatchMessage(Handler.java:102)在android.os.Looper.loop(Looper.java:154)在android.app.ActivityThread.main(位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866)处的java.lang.reflect.Method.invoke(本机方法)处的ActivityThread.java:6077) ZygoteInit.main(ZygoteInit.java:756)原因:java.lang.IllegalStateException:无法从CursorWindow读取行0,col -1。 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.example.sanket.databaseexample.DBHandler.databaseToString(DBHandler.java:57) at com.example.sanket.databaseexample.MainActivity.printDatabase(MainActivity.java:37) at com.example.sanket.databaseexample.MainActivity.onCreate(MainActivity.java:24) 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 an 在android.database.CursorWindow.nativeGetString(本机方法)在android.database.CursorWindow.getString(CursorWindow.java:438)在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)在com.example.sanket.databaseexample com.example.sanket.databaseexample.MainActivity.printDatabase(MainActivity.java:37)处的com.example.sanket.databaseexample.MainActivity.onCreate(MainActivity.java:24)处的.DBHandler.databaseToString(DBHandler.java:57) android.app.Activity.performCreate(Activity.java:6662)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)在android.app.ActivityThread .handleLaunchActivity(ActivityThread.java:2707)在android.app.ActivityThread.-wrap12(ActivityThread.java)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460)在android.os.Handler.dispatchMessage(Handler .java:102),位于android.os.Looper.loop(Looper.java:154) droid.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) 07-19 00:13:42.576 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 16.982ms 07-19 00:13:45.084 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 16.342ms 07-19 00:13:46.553 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 5.273ms 07-19 00:13:49.082 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 14.783ms 07-19 00:13:55.105 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 17.910ms 07-19 00:13:55.594 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 5.317ms 07-19 00:14:04.126 18415-18422/com.example.sanket.databaseexample W/art: Suspen droid.app.ActivityThread.main(ActivityThread.java:6077)位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866)位于java.lang.reflect.Method.invoke(本机方法) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)07-19 00:13:42.576 18415-18422 / com.example.sanket.databaseexample W / art:暂停所有线程:16.982ms 07- 19 00:13:45.084 18415-18422 / com.example.sanket.databaseexample W / art:暂停占用所有线程:16.342ms 07-19 00:13:46.553 18415-18422 / com.example.sanket.databaseexample W / art :暂停使用所有线程:5.273ms 07-19 00:13:49.082 18415-18422 / com.example.sanket.databaseexample W / art:暂停使用所有线程:14.783ms 07-19 00:13:55.105 18415-18422 / com.example.sanket.databaseexample W / art:挂起所有线程:17.910ms 07-19 00:13:55.594 18415-18422 / com.example.sanket.databaseexample W / art:挂起所有线程:5.317ms 07- 19 00:14:04.126 18415-18422 / com.example.sanket.databaseexample W / art:Suspen ding all threads took: 6.876ms 07-19 00:14:05.626 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 6.402ms 07-19 00:14:07.622 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 5.339ms 07-19 00:14:16.655 18415-18422/com.example.sanket.databaseexample W/art: Suspending all threads took: 6.749ms ding所有线程占用:6.876ms 07-19 00:14:05.626 18415-18422 / com.example.sanket.databaseexample W / art:暂停所有线程占用:6.402ms 07-19 00:14:07.622 18415-18422 / com .example.sanket.databaseexample W / art:挂起所有线程:5.339ms 07-19 00:14:16.655 18415-18422 / com.example.sanket.databaseexample W / art:挂起所有线程:6.749ms

Look at this error message: 查看此错误消息:

Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 2 columns. 无法从具有1行2列的CursorWindow中读取第0行第-1列。

Column -1... How is that possible? 列-1 ...那怎么可能? It's caused by this: 原因是:

 if (c.getString(c.getColumnIndex("productname")) != null) { 

There is no column named "productname" in the table. 表中没有名为“ productname”的列。 There is one named "product_name". 有一个名为“ product_name”的产品。 When the request column name doesn't exist, the getColumnIndex method returns -1. 当请求列名称不存在时, getColumnIndex方法将返回-1。

You used this constant when creating the table: 您在创建表时使用了此常量:

 public static final String COLUMN_PRODUCTNAME = "product_name"; 

It's good you put the table element names in constants, you should use them consistently everywhere, precisely to avoid this kind of typos, and to make maintenance easier. 最好将表元素名称放在常量中,应该在所有地方一致使用它们,以免发生这种错别字并简化维护。

if (c.getString(c.getColumnIndex(COLUMN_PRODUCTNAME)) != null) {

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试连接蓝牙Android时应用崩溃 - App crashes when trying to connect to bluetooth android 尝试存储SQLite数据时我的Android应用程序崩溃 - My Android app crashes when trying to store SQLite data 从SQLite数据库检索数据时Android应用程序崩溃 - Android app crashes when retrieving data from SQLite database 运行getAllComments()方法时,android SQLITE数据库应用程序oncreate崩溃 - android SQLITE database app crashes oncreate when it runs the getAllComments() method 尝试与 android studio 中的 jsoup 连接时,模拟器应用程序崩溃 - emulator app crashes when trying to connect with jsoup in android studio 单击Android登录按钮会使应用程序崩溃。 按钮验证使用Sqlite数据库的登录 - Android login button crashes app when clicked. Button validates login with Sqlite database 从 SQLite 数据库访问数据后应用程序崩溃 android - App crashes after accessing data from SQLite Database android 尝试在android sqlite中更新数据库时出错 - Error when trying to update database in android sqlite 将数据保存到数据库时,Android应用程序崩溃 - Android app crashes when saving data to database 尝试打开数据库连接以传递给Webview时,Android应用在活动时崩溃 - Android app crashes at activity when trying to open the database connection to pass to webview
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM