尝试连接到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) {