ECLIPSEでAndroid SQLiteDatabaseを使う方法

94 views
Skip to first unread message

籐野リタ

unread,
Jul 8, 2016, 11:24:58 AM7/8/16
to 日本Androidの会
ECLIPSE4.5にAndroid 2.1をインポートして、四択のクイズアプリを作成しています。

Database.javaに下記のクラスを作成します。

package jp.example.quiz;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper{

 public Database(Context context){
   super(context,"MyTable.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase db){
       db.execSQL("CREATE TABLE MyTable" +
 "(" +
    "_id INTEGER PRIMARY KEY AUTOINCREMENT" +
    ",Quiz TEXT" +
 ",Ans0 TEXT" +
 ",Ans1 TEXT" +
    ",Ans2 TEXT" +
    ",Ans3 TEXT" +
    ",Ans4 TEXT" +
    ")");

 db.execSQL("INSERT INTO MyTable(Quiz,Ans0,Ans1,Ans2,Ans3,Ans4)values→クイズの内容,正解,A1~A4

さらに下記のActivity クラスを作成します。

package jp.example.quiz;

import java.util.Random;
import jp.example.quiz.Database;
import jp.example.quiz.TitleActivity;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class QuestionActivity extends Activity implements OnClickListener{

   private String path;
   int Correct = 0;
   int Cnt = 1;

   SQLiteDatabase db;
   Cursor c;

   String Ans0;
   String Ans1;
   String Ans2;
   String Ans3;
   String Ans4;

   int No[] =new int[5];

   @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_question);
   Random rnd = new Random();
   for(int i = 0; i < 5; i++){

    No[i] = rnd.nextInt(10)+1;
              int x = No[i];
              for(i = 0; i < 5; i++)
           if(No[i] ==x)
           break;

       }
         onQuestion();
   }
    public void onQuestion() {

     String sql ="SELECT_id,Quiz,Ans0,Ans1,Ans2,Ans3,Ans4 FROM MyTable WHERE_id=" + String.valueOf(No[Cnt - 1]);
      Database dbHelper = new Database(this);

    db = dbHelper.getReadableDatabase();

    c=db.rawQuery(sql,null);
    c.moveToFirst();

    String Quiz = c.getString(c.getColumnIndex("Quiz"));
    Ans0 = c.getString(c.getColumnIndex("Ans0"));
    Ans1 = c.getString(c.getColumnIndex("Ans1"));
    Ans2 = c.getString(c.getColumnIndex("Ans2"));
    Ans3 = c.getString(c.getColumnIndex("Ans3"));
    Ans4 = c.getString(c.getColumnIndex("Ans4"));

    TextView txt = (TextView)findViewById(R.id.Question);
    txt.setText(Quiz);

    Button btnAns1 = (Button)findViewById(R.id.button1);
    Button btnAns2 = (Button)findViewById(R.id.button2);
    Button btnAns3 = (Button)findViewById(R.id.button3);
    Button btnAns4 = (Button)findViewById(R.id.button4);

    btnAns1.setText(Ans1);
    btnAns2.setText(Ans2);
    btnAns3.setText(Ans3);
    btnAns4.setText(Ans4);

    btnAns1.setOnClickListener(this);
    btnAns2.setOnClickListener(this);
    btnAns3.setOnClickListener(this);
    btnAns4.setOnClickListener(this);

    }
           public void onClick(View v){
           Button btn = (Button)v;
           String Answer = (String)btn.getText();

           if(Ans0.equals(Answer)){

            Correct++;
           }


           if(Cnt==5){

           Intent intent = new Intent(this,TitleActivity.class);
           startActivity(intent);

          }else{
           Cnt++;
           onQuestion();

実行すると、エラーログに

android.database.sqlite.SQLite Exeption:"SELECT_id,":syntax error(code 1):,while compiling:SELECT_id,Quiz,~Ans4 From MY Table WHERE_id=1

と出ます。どのように書き換えたらよいでしょうか。どうぞ、よろしくお願いします。
           



Yasutaka Kawamoto

unread,
Jul 8, 2016, 11:54:56 AM7/8/16
to 日本Androidの会
SQLite Exeptionのsyntax errorとあるので、SQLの文法が間違ってるのかなと思います。

確認していませんが、 SELECTと _id の間に半角スペースがないので怒られてるんだと思います。
あと、 WHEREと _idの間にも半角スペースが必要かと思います。
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
> https://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
かわもと

小田正枝

unread,
Jul 10, 2016, 4:32:50 AM7/10/16
to android-g...@googlegroups.com
Yasutaka Kawamoto  様

籐野 です。ご回答、ありがとうございます。

ただいま、PCの調子が悪く。まだ試していませんが、

もう一度書き直して、コンパイルかけてみます。

結果はまた投稿しますので、よろしくお願いいたします。

2016年7月9日 0:54 Yasutaka Kawamoto <kwm...@gmail.com>:
--
かわもと

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このトピックの登録を解除するには https://groups.google.com/d/topic/android-group-japan/gcMAkDsEeXo/unsubscribe にアクセスしてください。
このグループから退会し、グループのすべてのトピックの登録を解除するには android-group-j...@googlegroups.com にメールを送信してください。

小田正枝

unread,
Jul 19, 2016, 6:42:41 AM7/19/16
to android-g...@googlegroups.com
Yasutaka Kawamoto  様

籐野 です。PCが使えるようになりましたので、

アドバイスの通りに書き換えて、コンパイルをかけたところ、

実行はされますが、途中でプログラムが中止され、

ログカットに下記のように出ていました。

原因はなんでしょうか。ご回答、よろしくお願いします。

HardwareRenderer

Backbuffer cannot be preserved


AndroidRuntime

FATAL EXCEPTION: main

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)

at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)

at jp.example.quiz.QuestionActivity.onClick(QuestionActivity.java:97)

at jp.example.quiz.QuestionActivity.onQuestion(QuestionActivity.java:55)

at android.view.View.performClick(View.java:4207)


2016年7月10日 17:32 小田正枝 <mawa...@gmail.com>:

Yasutaka Kawamoto

unread,
Jul 19, 2016, 8:13:15 AM7/19/16
to 日本Androidの会
「原因はなんでしょうか」と聞かれても、わかりません。

とりあえず、そのlogcatに出ているエラーでググッてみることをおすすめします。
ここでは「CursorIndexOutOfBoundsException」を検索してみてはいかがでしょうか。

おそらく検索しても何を書いてるか分からないような気がしますが、
わからないことを1つ1つ調べてから、どうしても分からないことを質問をした方が
お互いのためだと思います。




2016年7月19日 19:41 小田正枝 <mawa...@gmail.com>:

小田正枝

unread,
Jul 20, 2016, 2:02:59 AM7/20/16
to android-g...@googlegroups.com
Yasutaka Kawamoto  様

籐野です。お騒がせしましたが、TargetSdkVersion を変えたところ、

34行目までは なんとか実行することができました。

まずはご連絡まで。

2016年7月19日 21:11 Yasutaka Kawamoto <kwm...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages