0

OKみんな、私がもっと前に、私はフォーラムや他の多くの人を検索しましたが、適切な答えが見つからなかったので、私は尋ねるかもしれないと思いました、私はその日を整理するためにこのアプリを作成しました、そしてそれはどういうわけかこのように機能します:-私2つのアクティビティがあります。1つは(リストビューに)データを表示するためのもので、もう1つは挿入用です。startActivityForResult関数を使用して2番目のアクティビティを開き、データを取得します。onActivityResult関数私はそれをデータベースに挿入します。Eclipseはエラーを表示せず、Lo​​gCatも表示しませんが、データはDbに挿入されていないようです。そのため、データを挿入して実行内容をログに記録するときにtry-catchメソッドを挿入しましたが、常にデータの例外が発生します。記録されませんでした。私はAndroidを初めて使用しますが、すべてが正しく行われているとは思いません。アプリケーションのすべてのコードを投稿したので、プロセス全体の概要がわかりますが、問題は(私が思うに)データベースが作成された場所、データが挿入された場所、または取得しようとしたアクティビティにあります一方から他方へのデータ。でもどこかわからないので助けてください!

MainActivity.java:

package com.example.dailyplanner;

import android.R.id;
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends ListActivity {


    private SQLiteDatabase db;
    Intent weather;     
    Intent i;
    String text;
    String date;
    String time;
    ListView lv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        db = openOrCreateDatabase("MyDB", MODE_PRIVATE, null);
        db.execSQL("CREATE TABLE IF NOT EXISTS TaskTbl (Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, text VARCHAR(250), time VARCHAR(20), date VARCHAR(20));");


        Button showBtn = (Button) findViewById(R.id.shTask);
        showBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {



            }
        });


        Button nTaskBtn = (Button) findViewById(R.id.nTask);
        nTaskBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Intent nTaskScreen = new Intent(getApplicationContext() new_task.class);

                startActivityForResult(nTaskScreen, 100);



            }
        });



        Button wthrBtn = (Button) findViewById(R.id.wthrBtn);
        registerForContextMenu(wthrBtn);


        lv = (ListView) findViewById(id.list);



    }








    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);

        MenuInflater mi = getMenuInflater();
        mi.inflate(R.menu.cities, menu);


    }


    @Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        return super.onContextItemSelected(item);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode==100)
        {
            i = getIntent();        
        String text = i.getStringExtra("text");
            String date = i.getStringExtra("date");
            String time = i.getStringExtra("time");
                try{


                db.execSQL("INSERT INTO TaskTbl (text,time,date) VALUES("+text+", "+time+", "+date+");");        

                Log.d("db","data was recorded");
            }
            catch (Exception e)
            {
                Log.e("db", "data was not recorded");

            }



        }

    }
}

New_task.java:

package com.example.dailyplanner;

import android.R.string;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.net.UrlQuerySanitizer.ValueSanitizer;
import android.os.Bundle;
import android.renderscript.Sampler.Value;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;

public class new_task extends Activity {

    static final int TIME_DIALOG_ID=0;
    static final int DATE_DIALOG_ID=1;
    public TextView timeText;
    public TextView dateText;
    public EditText taskText;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_task);


        timeText = (TextView) findViewById(R.id.timeTxt);
        dateText = (TextView) findViewById(R.id.dateTxt);
        taskText = (EditText) findViewById(R.id.editText1);

        Button btnSave = (Button) findViewById(R.id.btnSave);
        btnSave.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Intent i = new Intent(getApplicationContext(),     MainActivity.class);

                i.putExtra("date", dateText.getText().toString());
                i.putExtra("time", timeText.getText().toString());
                i.putExtra("text", taskText.getText().toString());

                setResult(100);

                finish();




            }
        });



        Button btnCancel = (Button) findViewById(R.id.btnCancel);
        btnCancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                finish();


            }
        });


    Button btnSetTime = (Button) findViewById(R.id.btnSetTime);
        btnSetTime.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                showDialog(TIME_DIALOG_ID);

            }
            });

        Button btnSetDate = (Button) findViewById(R.id.btnSetDate);
        btnSetDate.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                showDialog(DATE_DIALOG_ID);

            }
        });



    }

    TimePickerDialog.OnTimeSetListener mTimeSetListener = new     TimePickerDialog.OnTimeSetListener() {

                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    timeText.setText(hourOfDay+":"+minute);
                    };

    };


    DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {

            dateText.setText(dayOfMonth+"."+monthOfYear+"."+year);

        }
    };


    protected Dialog onCreateDialog(int id){
        switch(id){

        case TIME_DIALOG_ID:
        return new TimePickerDialog(this, mTimeSetListener, 0, 0, true);

        case DATE_DIALOG_ID:
            return new DatePickerDialog(this, mDateSetListener, 2011, 1, 28);


        }
        return null;

    }


}

LogCatは次のとおりです。

10-13 15:57:44.825: D/CLIPBOARD(9334): Hide Clipboard dialog at Starting input: finished by someone else... !
10-13 16:03:17.020: D/dalvikvm(10612): GC_FOR_ALLOC freed 135K, 4% free 12839K/13255K, paused 27ms
10-13 16:03:17.020: I/dalvikvm-heap(10612): Grow heap (frag case) to 13.069MB for 379472-byte allocation
10-13 16:03:17.075: D/dalvikvm(10612): GC_FOR_ALLOC freed <1K, 4% free 13209K/13639K, paused 55ms
10-13 16:03:17.115: D/AbsListView(10612): Get MotionRecognitionManager
10-13 16:03:17.305: D/CLIPBOARD(10612): Hide Clipboard dialog at Starting input: finished by someone else... !
10-13 16:03:21.740: D/dalvikvm(10612): GC_CONCURRENT freed 62K, 2% free 13626K/13895K, paused 3ms+2ms
10-13 16:03:21.790: D/dalvikvm(10612): GC_CONCURRENT freed 6K, 2% free 14073K/14343K, paused 2ms+2ms
10-13 16:03:21.825: D/AbsListView(10612): Get MotionRecognitionManager
10-13 16:03:21.875: D/dalvikvm(10612): GC_FOR_ALLOC freed 80K, 2% free 14324K/14599K, paused 13ms
10-13 16:03:23.130: D/dalvikvm(10612): GC_CONCURRENT freed 175K, 3% free 14678K/15047K, paused 2ms+4ms
10-13 16:03:28.910: D/AndroidRuntime(10612): Shutting down VM
10-13 16:03:28.910: W/dalvikvm(10612): threadid=1: thread exiting with uncaught exception (group=0x40c6f1f8)
10-13 16:03:28.915: E/AndroidRuntime(10612): FATAL EXCEPTION: main
10-13 16:03:28.915: E/AndroidRuntime(10612): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=100, data=null} to activity {com.example.dailyplanner/com.example.dailyplanner.MainActivity}: android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2994)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3037)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.ActivityThread.access$1100(ActivityThread.java:128)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1191)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.os.Looper.loop(Looper.java:137)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.ActivityThread.main(ActivityThread.java:4514)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at java.lang.reflect.Method.invokeNative(Native Method)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at java.lang.reflect.Method.invoke(Method.java:511)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at dalvik.system.NativeStart.main(Native Method)
10-13 16:03:28.915: E/AndroidRuntime(10612): Caused by: android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:92)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2020)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1960)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at com.example.dailyplanner.MainActivity.onActivityResult(MainActivity.java:182)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.Activity.dispatchActivityResult(Activity.java:4746)
10-13 16:03:28.915: E/AndroidRuntime(10612):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2990)
10-13 16:03:28.915: E/AndroidRuntime(10612):    ... 11 more
4

1 に答える 1

0

例外について尋ねるときは、常にlogcatからのスタックトレースを投稿する必要があります。

ただし、挿入が失敗する理由はわかります。テキストデータと日付は一重引用符で区切る必要があります。

INSERT INTO foo VALUES (myTextData)

失敗します

INSERT INTO foo VALUES ('myTextData')

動作します。

「'」+テキスト+「'」を使用

db.execSQL("INSERT INTO TaskTbl (text,time,date) VALUES(" + "'" + text + "', '" + time + "', '" + date + "');"); 

このような文字列を作成するときは、IDEエディタで構文の色の強調表示を使用して、適切な場所に引用符があることを確認してください。たとえば、私のIDEでは、文字列は緑色で表示され、識別子は黒色で表示されます。

[編集]

制約例外は、重複する行を追加しようとしていることを意味します。重複が許可されていない場合は、それに応じてこの例外を処理する必要があります。重複が許可されている場合は、_id列をプライマリとして使用します。これを試みたかもしれませんが、createステートメントは「_id」ではなく「id」という列を追加します。実際に「id」を使用する場合は、それが主キーであることを指定しているため、INSERTでその列に一意の値を使用する必要があります。

于 2012-10-13T12:38:10.830 に答える