[英]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.