Java android日记应用程序-将图像导入sqlite数据库

Java android日记应用程序-将图像导入sqlite数据库,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在写一个日记android应用程序,但该应用程序已停止 我已成功地将文本放入数据库(sqlite) 我还想把手机图库里的照片放到数据库里 添加照片代码后,应用程序已停止 我不知道如何解决这个问题 请帮我看看代码有什么问题 public class EditActivity extends Activity { private EditText editText; private Button phoBtn; private Button saveBtn; private Button can

我正在写一个日记android应用程序,但该应用程序已停止

我已成功地将文本放入数据库(sqlite) 我还想把手机图库里的照片放到数据库里 添加照片代码后,应用程序已停止 我不知道如何解决这个问题

请帮我看看代码有什么问题

public class EditActivity extends Activity {
private EditText editText;
private Button phoBtn;
private Button saveBtn;
private Button cancalBtn;
private DBHelper dbHelper;
private int id;

SQLiteDatabase db;
private  String selectedImagePath;
private static final int SELECT_PICTURE = 1;

ImageView iv;
Uri selectedImageUri;
String ivimage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit);
    editText = (EditText) findViewById(R.id.editText);
    phoBtn = (Button) findViewById(R.id.photos);
    saveBtn = (Button) findViewById(R.id.save);
    cancalBtn = (Button) findViewById(R.id.cancel);
    id = getIntent().getIntExtra("_id", -1);


    iv=(ImageView)findViewById(R.id.imageView1);

    System.out.println(id);
    dbHelper = new DBHelper(this);

    if (id != -1) {
        Cursor cursor = dbHelper.query(
                "select name,content,dt from DIARY where _id=?",
                new String[] { String.valueOf(id) });
        cursor.moveToFirst();
        String content = cursor.getString(1);
        editText.setText(content);
        String i=cursor.getString(cursor.getColumnIndex("image"));
         Uri imgUri=Uri.parse(i);
         iv.setImageURI(imgUri); 

        saveBtn.setOnClickListener(updateClickListener);
    }else
    {
        db.execSQL("insert into DIARY values('"+selectedImageUri+"')");

        saveBtn.setOnClickListener(saveClickListener);
    }

    cancalBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(EditActivity.this,MainActivity.class);
            startActivity(intent);
        }
    });

    phoBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(
                    Intent.createChooser(intent, "Select Picture"),
                    SELECT_PICTURE);
        }
    });
}

View.OnClickListener updateClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        String text = editText.getText().toString();
        ContentValues values = new ContentValues();
        values.put("content", text);

        String ivimage=iv.getContext().toString(); 
         values.put("image", ivimage);


        dbHelper.update(values,String.valueOf(id));
        Intent intent = new Intent(EditActivity.this,MainActivity.class);
        startActivity(intent);
    }
};

EditText et =null;
String text;
View.OnClickListener saveClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        et = new EditText(EditActivity.this);
        text = editText.getText().toString();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = format.format(new Date());
        et.setText(date);
        new AlertDialog.Builder(EditActivity.this)  
        .setTitle("My Diary")  
        .setIcon(android.R.drawable.ic_dialog_info)  
        .setView(et)  
        .setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String name = et.getText().toString();
                ContentValues values = new  ContentValues() ;
                values.put("name", name);
                values.put("content", text);
                values.put("image", ivimage);
                dbHelper.insert(values);
                Intent intent = new Intent(EditActivity.this,MainActivity.class);
                startActivity(intent);
            }
        })  
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        })
        .show();
    }
};

 public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                selectedImageUri = data.getData();

                selectedImagePath = getPath(selectedImageUri);
                System.out.println("Image Path : " + selectedImagePath);
                iv.setVisibility(View.VISIBLE);
                iv.setImageURI(selectedImageUri);
            }
        }
    }
}

java.lang.IllegalStateException:无法从CursorWindow读取第0行第1列。在从光标访问数据之前,请确保光标已正确初始化

这个例外来自于这里:

Cursor cursor = dbHelper.query(
        "select name,content,dt from DIARY where _id=?",
        new String[] { String.valueOf(id) });
cursor.moveToFirst();
String content = cursor.getString(1);
editText.setText(content);
String i=cursor.getString(cursor.getColumnIndex("image"));
光标不包含列
image
,并且
getColumnIndex()
返回
-1

要解决此问题,请将
图像
添加到投影:

select name,content,dt,image from ...

此外,在尝试读取列值之前,应检查
moveToFirst()的返回值以确保光标指向有效行。

第一步:logcat中的异常stacktrace。如果需要logcat中的异常stacktrace,如何执行如果您使用eclipse/adt,请打开logcat视图,查找与应用程序关联的红色“致命异常”行,然后是stacktrace。复制粘贴到此处。04-22 08:12:17.761:E/AndroidRuntime(792):java.lang.RuntimeException:无法启动活动组件信息{com.diary/com.diary.EditActivity}:java.lang.IllegalStateException:无法从游标窗口读取第0行、第1列。在访问数据之前,请确保光标已正确初始化。04-22 08:12:17.761:E/AndroidRuntime(792):在com.diary.EditActivity.onCreate(EditActivity.java:67)04-22 08:12:24.271:E/InputDispatcher(300):通道“40f91f20 com.diary/com.diary.MainActivity(服务器)”~通道已不可恢复地断开,将被处置!04-22 08:12:24.281:E/InputDispatcher(300):频道“40f4d108 com.daily/com.daily.EditActivity(服务器)”~频道已不可恢复地断开,将被处置!04-22 08:12:24.291:E/InputDispatcher(300):频道“40f12fa8 com.daily/com.daily.MainActivity(服务器)”~频道已不可恢复地损坏,将被处置!如果我的数据库像这样公开void onCreate(SQLiteDatabase db){String sql=“CREATE TABLE”+TABLE+”(_idinteger not null主键自动递增,NAME VARCHAR(50),CONTENT TEXT,IMAGE VARCHAR,DT TIMESTAMP default(datetime('now','localtime'));“db.execSQL(sql);}有其他方法吗?String ivimage=cursor getString(2);uriimguri=Uri.parse(ivimage);iv.setImageURI(imgUri);但是我更改了代码“select name,content,image,dt from DIARY where _id=?”,它又停止了,whyAgain,用stacktrace.04-22 21:46:07.602:E/AndroidRuntime(19849):java.lang.RuntimeException:无法启动活动组件信息{com.DIARY/com.DIARY.EditActivity}:java.lang.NullPointerException:uriString 04-22 21:46:07.602:E/AndroidRuntime(19849):在com.diary.EditActivity.onCreate(EditActivity.java:69)04-22 21:46:07.662:E/SQLiteDatabase(19849):从未对数据库“/data/data/com.diary/databases/dialog.db”04-22 21:46:07.662:E/SQLiteDatabase(19849)显式调用close():位于com.diary.db.DBHelper.getDb(DBHelper.java:27)