質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2181閲覧

android SQLite連動

cray

総合スコア29

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/06/22 07:52

編集2016/06/23 00:43

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) 

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mryo0826

2016/06/22 07:58

adbに強制終了時の例外が出ているはずなのでその内容を添付して頂けないでしょうか。
cray

2016/06/22 08:33

Logcatを追加したしました。
guest

回答3

0

ベストアンサー

ログを見る限りだと何かExceptionが発生して落ちているのではなく、
ANRが発生しているだけのように見えます。

アプリ実行時に出るダイアログは「応答がありません~「終了」「待機」」みたいなダイアログじゃないですか?
Exceptionが発生しているのであれば「~が異常終了しました。」みたいなダイアログのはずです。

ANRはUIスレッドをブロックすることで発生します。

Cursor cursor = db.query("MyTable", cols, selection, selectionArgs, groupBy, having, orderBy);

上記コードで何件のデータを取得しているかは提示されたコードでは不明ですが、ここで処理に時間がかかっているのではないでしょうか。

投稿2016/06/22 09:26

Yossi_1982

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray

2016/06/23 00:46

問題が発生したためアプリを終了します。というダイアログが出ます。 このダイアログはANRが発生しているということなのでしょうか?
Yossi_1982

2016/06/23 01:10 編集

問題が発生したため~のダイアログはExceptionでの終了だと思います。 変更いただいたログもExceptionのものに変わっていますね。 score1 =Integer.parseInt(cursor.getString(0)); の前の行に cursor.moveToFirst(); を入れてみてもらっていいですか?
cray

2016/06/23 04:05

cursor.moveToFirst();を入れたら無事に動きました!ありがとうございます!助かりました!!
guest

0

データベースの内容がどうなっているのか確認してみたほうがいいのでは?
EclipseならSQLite Browserなどでデータベースの内容を確認してみてはいかがでしょう?

投稿2016/06/23 03:10

jm1156

総合スコア866

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray

2016/06/23 04:07

ご回答ありがとうございます。今回の原因はcursor.moveToFirst();の一文が抜けていることでした。今後DB関係で詰まってしまったらDB内部を確認するようにしたいと思います!ありがとうございました!
guest

0

DB_VERを2にして再度実行してみてください。
また、エラーログの追記もしてください。

投稿2016/06/22 08:12

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray

2016/06/22 08:25

DB_BERを2にして再度実行してみましたが変化はありませんでした。 Logcatも変化はなさそうでした。
yona

2016/06/22 08:52

指定しているカラム名が無いそうです。 半角、全角の違いはありませんか? 一度アプリケーションをアンインストールしてから、一度だけデータを挿入する処理を実行してください。 ログも上記の処理を行っている間だけを追記してください。
cray

2016/06/23 00:52 編集

半角全角の間違いはなさそうです。 アプリを一度アンインストールし、一度だけadd(100,200,300)を実行しました。 そうすると今までは ``` Cursor cursor = db.query("MyTable", cols, selection, selectionArgs, groupBy, having, orderBy); ``` でエラーが出ていたのですが 今回はload関数の ``` score1 =Integer.parseInt(cursor.getString(0)); score2 =Integer.parseInt(cursor.getString(1)); score3 =Integer.parseInt(cursor.getString(2)); ``` でエラーが起きました。型変換で何か問題があるのでしょうか? アンインストールしてまたインストールしなおしたらLogcatの内容が変わりましたので 編集しました。
yona

2016/06/23 01:09

今起きている問題は、あるはずのカラム(score1,score2,score3)が取れていないことです。 まず、カラム名、テーブル名のハードコーディングを定数にリファクタリングしてください。 addの引数を全てStringにしてください。型を揃えましょう。 アンインストールしてから再度実行してください。
cray

2016/06/23 04:06

原因はcursor.moveToFirst();の文が抜けていたことでした。この文を記述したら無事に動きました。 アプリをアンインストールすればDBの中身がなくなることを知らなかったので大変勉強になりました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問