2017-07-18 6 views
0

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:

7月19日00:13:34.764 18415から18415 /? I/art:遅くない-Xcheck:jni (すでにオン)07-19 00:13:34.765 18415-18415 /? 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 /技術:アンドロイド 4.1する前に、方法android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter、 アンドロイド.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: は、行0、列-1を1行2 の列を持つCursorWindowから読み取れませんでした。 7月19日00:13:36.143 18415から18415/com.example.sanket.databaseexampleのD/AndroidRuntime: は---------クラッシュ7月19日0時13分の開始をVM

をシャットダウン:36.148 18415から18415/com.example.sanket.databaseexample E/AndroidRuntime:FATAL EXCEPTION:メイン プロセス: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から読み取れませんでした。 からデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。 で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(ActivityThread.java:6077)の (java.lang.reflect.Metho) d.invoke(ネイティブメソッド) を com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 原因:java.lang.IllegalStateException:行0、列 -1をCursorWindowから読み取れませんでした。カーソルがデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。 android.database.CursorWindowの com.example.sanket.databaseexample.DBHandlerでandroid.database.CursorWindow.getStringでnativeGetString(ネイティブメソッド) android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)で(CursorWindow.java:438) .databaseToString MainActivity.java:24 com.example.sanket.databaseexample.MainActivity.onCreateでcom.example.sanket.databaseexample.MainActivity.printDatabase(MainActivity.java:37)で(DBHandler.java:57) ( ) android.app.Activity.performCreate(Activity.java:6662) a android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)におけるT android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) でandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) android.app.ActivityThread.-wrap12 android.os.Handler.dispatchMessageで(ActivityThread.java) でandroid.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460) (Handler.java:102)で android.os.Looper.loopの (Looper.java:154) android.app.Activi tyThread.main java.lang.reflect.Method.invokeで(ActivityThread.java:6077) (ネイティブメソッド) でcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866) で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:すべてを中断する スレッドを取った: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 7月19日00:14:16.655 18415から18422/com.example.sanket.databaseexampleのW /アート:すべての のスレッドを一時停止がかかった:このエラーメッセージで6.749ms

答えて

2

ルック:

1行2列のCursorWindowから行0、列-1を読み取ることができませんでした。

カラム-1 ...どうすれば可能ですか?

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

表に "PRODUCTNAME" という名前の列がありません:それは、このによって引き起こされています。 "product_name"という名前のものがあります。 要求列名が存在しない場合、 getColumnIndexメソッドは-1を返します。

テーブルを作成するときは、この定数を使用:

public static final String COLUMN_PRODUCTNAME = "product_name"; 

をそれはあなたがこの種のを避けるために、正確に、一貫してどこでも それらを使用する必要があります 、あなたは定数でテーブル要素名を入れて良いことですオススメ、 とメンテナンスを容易にする。

if (c.getString(c.getColumnIndex(COLUMN_PRODUCTNAME)) != null) { 
関連する問題