Java android日记应用程序-将图像导入sqlite数据库
我正在写一个日记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
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)