如何显示、选择、编辑和删除ListView,在SQLite数据库(Java Android应用程序)的3列上存储3个编辑文本
我正在尝试建立一个应用程序,用户将输入3个编辑文本上的3个数据,然后存储到数据库的3列中。用户将其显示在列表视图中,该列表视图允许用户选择整个项目以编辑其中一个文本字段或删除整个项目。到目前为止,向数据库中添加数据的工作仍在进行,它被存储到3个不同的列中。至于显示,它只显示第一个编辑文本,这是数据库中的第一列数据,即BodyTemp,当我尝试选择该项时,整个应用程序崩溃 ViewRecords.java如何显示、选择、编辑和删除ListView,在SQLite数据库(Java Android应用程序)的3列上存储3个编辑文本,java,android,listview,android-sqlite,Java,Android,Listview,Android Sqlite,我正在尝试建立一个应用程序,用户将输入3个编辑文本上的3个数据,然后存储到数据库的3列中。用户将其显示在列表视图中,该列表视图允许用户选择整个项目以编辑其中一个文本字段或删除整个项目。到目前为止,向数据库中添加数据的工作仍在进行,它被存储到3个不同的列中。至于显示,它只显示第一个编辑文本,这是数据库中的第一列数据,即BodyTemp,当我尝试选择该项时,整个应用程序崩溃 ViewRecords.java package mdad.project; import java.util.ArrayLi
package mdad.project;
import java.util.ArrayList;
import com.example.manandhowproject.R;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class ViewRecords extends Activity {
DatabaseHelper dbhelper;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewrecords);
dbhelper = new DatabaseHelper(this);
listView = (ListView) findViewById(R.id.listView);
populateListView();
}
private void populateListView()
{
Cursor records = dbhelper.getRecords();
ArrayList<String> listRec = new ArrayList<String>();
while(records.moveToNext()){
listRec.add(records.getString(1));
}
ListAdapter adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listRec);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String BTemp = adapterView.getItemAtPosition(i).toString();
String HRate = adapterView.getItemAtPosition(i).toString();
String Bmi = adapterView.getItemAtPosition(i).toString();
Cursor data = dbhelper.getRecID(BTemp, HRate, Bmi);
int recID = -1;
while(data.moveToNext()){
recID = data.getInt(0);
}
if(recID > -1){
Intent editScreenIntent = new Intent(ViewRecords.this, EditDel.class);
editScreenIntent.putExtra("id",recID);
editScreenIntent.putExtra("Body Temperature",BTemp);
editScreenIntent.putExtra("Heart Rate",HRate);
editScreenIntent.putExtra("BMI",Bmi);
startActivity(editScreenIntent);
}
else{
Toast.makeText(getApplicationContext(), "No ID Associated", Toast.LENGTH_LONG).show();
}
}
});
}}
EditDel.java
package mdad.project;
import com.example.manandhowproject.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class EditDel extends Activity {
Button btnSave,btnDelete;
EditText etBT, etHR, etBMI;
DatabaseHelper dbhelper;
private String selectedBtemp, selectedHrate, selectedBMI;
private int selectedID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editdel);
btnSave = (Button) findViewById(R.id.btnSave);
btnDelete = (Button) findViewById(R.id.btnDelete);
etBT = (EditText) findViewById(R.id.etBT);
etHR = (EditText) findViewById(R.id.etHR);
etBMI = (EditText) findViewById(R.id.etBMI);
dbhelper = new DatabaseHelper(this);
Intent receivedIntent = getIntent();
selectedID = receivedIntent.getIntExtra("id",-1);
selectedBtemp = receivedIntent.getStringExtra("BTemp");
selectedHrate = receivedIntent.getStringExtra("Hrate");
selectedBMI = receivedIntent.getStringExtra("Bmi");
etBT.setText(selectedBtemp);
etHR.setText(selectedHrate);
etBMI.setText(selectedBMI);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String bodytemp = etBT.getText().toString();
String heartrate = etHR.getText().toString();
String bmi = etBMI.getText().toString();
if(!bodytemp.equals("") && !heartrate.equals("") && !bmi.equals("")){
dbhelper.updateBtemp(bodytemp,selectedID,selectedBtemp);
dbhelper.updateHrate(heartrate,selectedID,selectedHrate);
dbhelper.updateBMI(bmi,selectedID,selectedBMI);
}else{
toastMessage("Please ensure all fields are filled.");
}
}
});
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbhelper.deleteBtemp(selectedID,selectedBtemp);
dbhelper.deleteHrate(selectedID,selectedHrate);
dbhelper.deleteBMI(selectedID,selectedBMI);
etBT.setText("");
etHR.setText("");
etBMI.setText("");
toastMessage("removed from database");
}
});
}
/**
* customizable toast
* @param message
*/
private void toastMessage(String message){
Toast.makeText(this,message, Toast.LENGTH_SHORT).show();
}
}
事故日志
02-07 01:14:44.373: E/AndroidRuntime(17899): FATAL EXCEPTION: main
02-07 01:14:44.373: E/AndroidRuntime(17899): android.database.sqlite.SQLiteException: unrecognized token: "666666ANDBMI" (code 1): , while compiling: SELECT ID FROM myrec_data WHERE BodyTemp = '666666ANDHeartRate = '666666ANDBMI = '666666'
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
02-07 01:14:44.373: E/AndroidRuntime(17899): at mdad.project.DatabaseHelper.getRecID(DatabaseHelper.java:69)
02-07 01:14:44.373: E/AndroidRuntime(17899): at mdad.project.ViewRecords$1.onItemClick(ViewRecords.java:47)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AbsListView$1.run(AbsListView.java:3463)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.os.Handler.handleCallback(Handler.java:730)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.os.Handler.dispatchMessage(Handler.java:92)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.os.Looper.loop(Looper.java:137)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.app.ActivityThread.main(ActivityThread.java:5103)
02-07 01:14:44.373: E/AndroidRuntime(17899): at java.lang.reflect.Method.invokeNative(Native Method)
02-07 01:14:44.373: E/AndroidRuntime(17899): at java.lang.reflect.Method.invoke(Method.java:525)
02-07 01:14:44.373: E/AndroidRuntime(17899): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-07 01:14:44.373: E/AndroidRuntime(17899): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-07 01:14:44.373: E/AndroidRuntime(17899): at dalvik.system.NativeStart.main(Native Method)
您需要在sql中添加一些引号和空格 从 到
虽然使用JDBC或JPA并使用set方法会更好'666666和HeartRate='666666和BMI='666666'真的吗?@ScaryWombat 666666是我尝试添加数据库时在编辑文本中输入的值。如果有机会,请查找SQL注入攻击。。。不管怎样,Android文档建议使用此选项而不是SQLiteOpenHepler。另外,您打算如何仅使用包含记录的列表来显示三列。getString1?@cricket_007您介意告诉我如何更改它以便显示三列吗?谢谢,不使用rawQuery将是首选@cricket_007谢谢,我不确定android的具体方式,但由于问题标记为java,我将把它留在这里。目前我可以选择,它将提示EditDel页面,然而,ListView仍然没有显示我想要的3列,它只显示第一列,即body temp,即使我选择它,它也没有我使用intent函数实现的EditDel页面的值,请参见上面的代码。另外,当我想删除它时,它会显示从数据库中删除的记录,这是我在代码中添加的吐司,当记录被删除时,但当我检查它仍然存在时。请告知。嗨,欧凯文,请考虑编辑你的问题或者用相关的信息做一个新的问题。我已经解决了正在发生的异常thrown@cricket_007我同意OP应该使用它们
02-07 01:14:44.373: E/AndroidRuntime(17899): FATAL EXCEPTION: main
02-07 01:14:44.373: E/AndroidRuntime(17899): android.database.sqlite.SQLiteException: unrecognized token: "666666ANDBMI" (code 1): , while compiling: SELECT ID FROM myrec_data WHERE BodyTemp = '666666ANDHeartRate = '666666ANDBMI = '666666'
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
02-07 01:14:44.373: E/AndroidRuntime(17899): at mdad.project.DatabaseHelper.getRecID(DatabaseHelper.java:69)
02-07 01:14:44.373: E/AndroidRuntime(17899): at mdad.project.ViewRecords$1.onItemClick(ViewRecords.java:47)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.widget.AbsListView$1.run(AbsListView.java:3463)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.os.Handler.handleCallback(Handler.java:730)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.os.Handler.dispatchMessage(Handler.java:92)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.os.Looper.loop(Looper.java:137)
02-07 01:14:44.373: E/AndroidRuntime(17899): at android.app.ActivityThread.main(ActivityThread.java:5103)
02-07 01:14:44.373: E/AndroidRuntime(17899): at java.lang.reflect.Method.invokeNative(Native Method)
02-07 01:14:44.373: E/AndroidRuntime(17899): at java.lang.reflect.Method.invoke(Method.java:525)
02-07 01:14:44.373: E/AndroidRuntime(17899): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-07 01:14:44.373: E/AndroidRuntime(17899): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-07 01:14:44.373: E/AndroidRuntime(17899): at dalvik.system.NativeStart.main(Native Method)
WHERE " + COL2 + " = '" + BTemp + "AND" ...
WHERE " + COL2 + " = '" + BTemp + "' AND " ....