2

アンドロイド 2.3.3

私は AsyncTask を初めて使用するので、私の実装が正しい場合とそうでない場合があります。AsyncTask を使用してデータベースにデータを挿入する必要があります。

エラーや例外は発生していませんが、データベースが作成されていません。問題がデータベースに関連しているのか、asynctask に関連しているのかわかりませんでした。だから私は以下のコードを提供しています。ご覧ください。

データベースファイル :::

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

public class Database_SpeedDial extends SQLiteOpenHelper{

    static String name = "speeddial_contacts";
    static int version = 1;

    SQLiteDatabase db;

    public Database_SpeedDial(Context context) {
        super(context, name, null, version);
        // TODO Auto-generated constructor stub

        db = getWritableDatabase();     
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

        db.execSQL("CREATE TABLE IF NOT EXISTS contacts(count INTEGER, image_url TEXT, name TEXT, number TEXT, bool INTEGER)");     
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

    public void insert_row(int count, String image_url, String name, String number, int bool) {
        // TODO Auto-generated method stub

        db.execSQL("INSERT INTO contacts VALUES('"+ count +"', '"+ image_url +"', '"+ name +"', '"+ number +"', '"+ bool +"')");
    }



}

これが私のJavaコードです:::

public class Class_Add_Contact extends Activity implements OnClickListener {

Database_SpeedDial dbObj;

@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        switch (v.getId()) {
        case R.id.btn_addcontact_add:

            System.out.println("Inside onClick");

            // Using AsyncTask
            // alImage, alContactName ,.... are ArrayList<String>
            InsertData id = new InsertData(alImage, alContactName, alPhoneNumber, alBoolean); 
            id.execute();
            System.out.println("Finished Inserting");

            break;

        case R.id.btn_addcontact_cancel:

            System.out.println("Cancel button clicked");

            break;

        default:
            break;
        }

    }


private class InsertData extends AsyncTask<Void, Void, Void>{

        ArrayList<String> alImage_insertdata;
        ArrayList<String> alContactName_insertdata;
        ArrayList<String> alPhoneNumber_insertdata;
        ArrayList<Boolean> alBoolean_insertdata;

        public InsertData(ArrayList<String> alImage, ArrayList<String> alContactName, 
                ArrayList<String> alPhoneNumber, ArrayList<Boolean> alBoolean)
        {
            alImage_insertdata = alImage;
            alContactName_insertdata = alContactName;
            alPhoneNumber_insertdata = alPhoneNumber;
            alBoolean_insertdata = alBoolean;
        }


        @Override
        protected void onPreExecute() { 

            System.out.println("Inside onPreExecute");
        }


        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            System.out.println("Inside doInBackground");

                    //dbObj = new Database_SpeedDial(this) -> I used this in onCreate()
                    // of the main class but didn't work, so shifted it here...
                    // This doesn't matter i guess...

            dbObj = new Database_SpeedDial(Class_Add_Contact.this);

            for(int i=0; i< alBoolean_insertdata.size();i++)
            {
                if(alBoolean.get(i))
                {
                    dbObj.insert_row(i+1, alImage_insertdata.get(i).toString(), 
                            alContactName_insertdata.get(i).toString(), 
                            alPhoneNumber_insertdata.get(i).toString(), 
                            1);
                }
                else
                {
                    dbObj.insert_row(i+1, alImage_insertdata.get(i).toString(), 
                            alContactName_insertdata.get(i).toString(), 
                            alPhoneNumber_insertdata.get(i).toString(),
                            0);
                }
            }

            return null;
        }   

        @Override
        protected void onPostExecute(Void res) {

            System.out.println("Inside onPostExecute");

        }


    }

}

DDMS からの画像 :::

ここに画像の説明を入力

コードは問題なく実行されますが、データベースは作成されません。何が問題なのですか?

4

2 に答える 2

3

列に「count」という名前を付けることはできません。これは予約済みのキーワードです。

編集

わかりました、どうやらそうではありません。しかし、そうあるべきです。

于 2013-04-09T16:04:50.943 に答える
0

CREATE TABLE ステートメントがある onCreate() メソッドは、データベースでの最初のトランザクションの後に起動されます。したがって、最初に挿入ステートメントを実行してから、データベースが作成されているかどうかを確認してください。

于 2013-04-09T15:52:16.503 に答える