SQLiteOpenHelper を使用したアプリを作成しています。
http://yan-note.blogspot.jp/2010/09/android-select.html
こちらのコードを参考にコードを書いてみたのですが、読み込み処理のところで実行時エラーになってしまいます。
以下ソースです。(一部省略しています)
##MainActivity.java
int score1 = 0, score2 = 0, score3 = 0; //データを挿入する public void add(int sc1,int sc2,int sc3) { DatabaseHelper dbHelper = new DatabaseHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); try { ContentValues values = new ContentValues(); values.put("score1",sc1); values.put("score2",sc2); values.put("score3",sc3); db.insert("MyTable", null, values); } finally { db.close(); } } //データをとりだす public void load() { //queryメソッドでデータを取得 String[] cols = {"score1","score2","score3"}; String selection = null; String[] selectionArgs = null; String groupBy = null; String having = null; String orderBy = null; DatabaseHelper dbHelper = new DatabaseHelper(this); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("MyTable", cols, selection, selectionArgs, groupBy, having, orderBy); score1 =Integer.parseInt(cursor.getString(0)); score2 =Integer.parseInt(cursor.getString(1)); score3 =Integer.parseInt(cursor.getString(2)); } FieldView mFieldView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); set(); } @Override protected void onStop() { super.onStop(); set(); } void set() { LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = layoutInflater.inflate(R.layout.start, null, false); setContentView(view); load(); setscore(); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { { LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = layoutInflater.inflate(R.layout.activity_main, null, false); setContentView(view); } } }); }
##DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper { /* データベース名 */ private final static String DB_NAME = "androidstudydb"; /* データベースのバージョン */ private final static int DB_VER = 1; /* * コンストラクタ */ public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VER); } /* * onCreateメソッド * データベースが作成された時に呼ばれます。 * テーブルの作成などを行います。 */ @Override public void onCreate(SQLiteDatabase db) { String sql = ""; sql += "create table MyTable ("; sql += " No integer primary key autoincrement"; sql += ",score1 text not null"; sql += ",score2 text"; sql += ",score3 text"; sql += ")"; db.execSQL(sql); } /* * onUpgradeメソッド * onUpgrade()メソッドはデータベースをバージョンアップした時に呼ばれます。 * 現在のレコードを退避し、テーブルを再作成した後、退避したレコードを戻すなどの処理を行います。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
実行すると
Cursor cursor = db.query("MyTable", cols, selection, selectionArgs, groupBy, having, orderBy);
の文で実行時エラーになり、アプリが強制終了してしまいます。
原因がわかりますでしょうか?
以下logcatです。長すぎるので最初の部分を書きます。
06-23 00:40:28.731 11746-11746/com.example.masa_2.tetrisver3 W/System: ClassLoader referenced unknown path: /data/app/com.example.masa_2.tetrisver3-1/lib/x86 06-23 00:40:28.859 11746-11746/com.example.masa_2.tetrisver3 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 06-23 00:40:31.595 11746-11746/com.example.masa_2.tetrisver3 D/AndroidRuntime: Shutting down VM --------- beginning of crash 06-23 00:40:31.596 11746-11746/com.example.masa_2.tetrisver3 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.masa_2.tetrisver3, PID: 11746 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.masa_2.tetrisver3/com.example.masa_2.tetrisver3.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460) at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) at com.example.masa_2.tetrisver3.MainActivity.load(MainActivity.java:398) at com.example.masa_2.tetrisver3.MainActivity.set(MainActivity.java:425) at com.example.masa_2.tetrisver3.MainActivity.onCreate(MainActivity.java:408) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148)
回答3件
あなたの回答
tips
プレビュー