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

问题描述:

我的android应用程序崩溃并显示此错误。尝试连接到SQLite数据库时,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 /?我/艺术:不迟到启用-Xcheck:jni (已在)07-19 00:13:34.765 18415-18415 /? W/art:意外的CPU 变种X86使用默认值: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 W/art:暂停全部 线程花费:7.732ms 07-19 00:13:36.142 18415-18415/com.example.sanket.databaseexample E/CursorWindow:失败 从具有1行的CursorWindow读取第0行第-1列,2 列。 07-19 00:13:36.143 18415-18415/com.example.sanket.databaseexample d/AndroidRuntime: 关闭VM

---------暴跌07-19 00:13开头:36.148 18415-18415/com.example.sanket.databaseexample E/AndroidRuntime:致命 EXCEPTION:主要 进程:com.example.sanket.databaseexample,PID:18415 java.lang.RuntimeException:无法启动活动 ComponentInfo { com.example.sanket.databaseexample/com.example.sanket.databaseexample.MainActivity}: java.lang.IllegalStateException:无法从CursorWindow读取第0行,第-1列。确保光标在 从其访问数据之前正确初始化。 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在android.app.ActivityThread.-wrap12(ActivityThread.java) 在Android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154)处,在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460) ( ) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Metho d.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 引起:java.lang.IllegalStateException:无法从CursorWindow读取第0行,第 -1行。在从中访问数据之前,确保Cursor已正确初始化。在android.database.CursorWindow上的 。nativeGetString(本机方法) 在android.database.CursorWindow.getString(CursorWindow.java:438) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 在 com.example.sanket.databaseexample.DBHandler .databaseToString(DBHandler.java:57) 在 com.example.sanket.databaseexample.MainActivity.printDatabase(MainActivity.java:37) 在 com.example.sanket.databaseexample.MainActivity.onCreate(MainActivity.java:24 ) at android.app.Activity.performCreate(Activity.java:6662) a吨 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) at android.os.Looper.loop(Looper.java:154) at android.app.Activi tyThread.main(ActivityThread.java:6077) 在java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866) 在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:挂起所有 线程花费: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 /艺术:暂停所有 线程了:6.749ms

看看这个错误消息:

无法从具有1行2列的CursorWindow读取第0行第-1列。

Column -1 ...这怎么可能?它造成的:

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

没有在表中名为“产品名称”一栏。 有一个名为“product_name”的产品。 当请求列名不存在时, 方法getColumnIndex返回-1。

你使用这个常量时创建表:

public static final String COLUMN_PRODUCTNAME = "product_name"; 

这是很好的你把常数表元素名称, 您应该始终如一地在任何地方使用它们, 正是为了避免这种错别字, ,并使维护更容易。

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