android sqlite数据库检索有问题
我正在android中制作一个tableview,其中有两列。第一列是itemname,第二列是itemprice。我已经把所有东西都连接到数据库了。我做了一个很好的选择,将itemname列作为一个自动完成文本视图进行修改,并将其连接到listview,后者进一步连接到隐藏的数据库。所以,我得到了项目名称。。。现在我想,每当我在列中添加itemname时,相应项目数据库中的价格都会自动检索到列中……请帮助我,我从上个月开始就被它绊倒了android sqlite数据库检索有问题,android,database,sqlite,tableview,Android,Database,Sqlite,Tableview,我正在android中制作一个tableview,其中有两列。第一列是itemname,第二列是itemprice。我已经把所有东西都连接到数据库了。我做了一个很好的选择,将itemname列作为一个自动完成文本视图进行修改,并将其连接到listview,后者进一步连接到隐藏的数据库。所以,我得到了项目名称。。。现在我想,每当我在列中添加itemname时,相应项目数据库中的价格都会自动检索到列中……请帮助我,我从上个月开始就被它绊倒了 public Cursor getAllData1()
public Cursor getAllData1() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor res1 = db.rawQuery("select * from " + Tname, null);
return res1;
}
在我的主要活动中
private void preparedata() {
list = new ArrayList<String>();
Cursor res1 = mydb.getAllData1();
if (res1.getCount() == 0) {
Toast.makeText(this, "No data in the database", Toast.LENGTH_SHORT).show();
} else {
while (res1.moveToNext()) {
list.add(res1.getString(2));
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
adapter1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_2,array);
listView.setAdapter(adapter);
}
}
}
--------------------------------------------------------------------------
autocompletetextview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try {
Cursor res2 = mydb.getAllData1();
if (res2.getCount() == 0) {
Toast.makeText(shopp.this, "no item added", Toast.LENGTH_SHORT).show();
} else {
while (res2.moveToNext()) {
et8.setText(res2.getString(2));
}
{
}
}
} catch (Exception e) {
Toast.makeText(shopp.this, "Oops something went wrong", Toast.LENGTH_SHORT).show();
}
}
});
你出错或使事情不必要地复杂化的一个方面是在你的Onite McClick列表中 下面的答案是一个使用游标适配器SimpleCursorAdapter并显示Itemname和Itemprice列的工作示例。另外,单击一个项目会删除所有值,长时间单击会删除一个项目并刷新ListView 但是,游标适配器需要一个列名_id,它希望它是rowid列的值。rowid列是唯一标识行的特殊列,但它通常是隐藏的。返回游标方法getAllData2的代码中的查询利用了这一点,基本上select SQL是从表中选择rowid作为_id,* 由于基础源是游标,因此为您定位的游标可用,因此所有值都可用。因此,无需搜索,只需从光标获取值即可。onItemClick/onItemLongClick的第四个附加参数是_id列中的值rowid,可用于查找示例中的特定行。onItemLongClick使用该参数删除该行 数据库帮助程序DBHelper.java:-
嘿,阿廷帕尔,你能分享数据库连接的代码,数据库方法和数据检索功能吗?进一步解释这个问题,并给出一些代码和崩溃日志。很难想象我能分享我的代码先生@msure@NIKHILMAURYA先生我能解释我分享了我的代码先生请帮助我很多先生,我会试试这个
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String Tname = "mytable";
public static final String COL_ITEMNAME = "itemname";
public static final String COL_ITEMPRICE = "itemprice";
String crt_tbl = "CREATE TABLE IF NOT EXISTS " + Tname + "(" +
COL_ITEMNAME + " TEXT UNIQUE," +
COL_ITEMPRICE + " REAL DEFAULT 0.0" +
")";
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(crt_tbl);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
}
public long addItem(String itemname, Double itemprice) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_ITEMNAME,itemname);
cv.put(COL_ITEMPRICE, itemprice);
return db.insert(Tname,null,cv);
}
//<<<<<<<<<< NOT USED
public Cursor getAllData1() {
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("select * from " + Tname, null);
}
//<<<<<<<<<< ALTERNATIVE USED
public Cursor getAllData2() {
SQLiteDatabase db = this.getWritableDatabase();
String[] columns = new String[]{"rowid AS " + BaseColumns._ID,"*"}; //<<<<<<<<<< see Note below
return db.query(Tname,columns,null,null,null,null,null);
}
public int deleteItemByRowid(long id) {
String whereclause = "rowid" + "=?";
String[] whereargs = new String[]{String.valueOf(id)};
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(Tname,whereclause,whereargs);
}
}
public class MainActivity extends AppCompatActivity {
ListView mListView;
DBHelper mydb;
Cursor mCsr;
SimpleCursorAdapter mSCA;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mListView = this.findViewById(R.id.listview);
mydb = new DBHelper(this);
addSomeDataForTesting(); //<<<<<<<<<< Add some test data
doListView(); //<<<<<<<<<< setup the listview
}
private void doListView() {
mCsr = mydb.getAllData2();
if (mSCA == null) {
mSCA = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2,
mCsr,
new String[]{
DBHelper.COL_ITEMNAME,
DBHelper.COL_ITEMPRICE
},
new int[]{
android.R.id.text1,
android.R.id.text2
},
0
);
mListView.setAdapter(mSCA);
// Set the onItemClick Listener
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(mContext,
"You clicked on " + mCsr.getString(mCsr.getColumnIndex(DBHelper.COL_ITEMNAME)) +
". The Price is " + String.valueOf(mCsr.getDouble(mCsr.getColumnIndex(DBHelper.COL_ITEMPRICE))) +
". The rowid is " + String.valueOf(mCsr.getLong(mCsr.getColumnIndex(BaseColumns._ID))) +
". Alternately the rowid is " + String.valueOf(l), //<<<<<<<<<< l is the value of the column _id
Toast.LENGTH_SHORT
).show();
}
});
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
mydb.deleteItemByRowid(l); //<<<<<<<<< uses the value of the 4th parameter passed which is the value of the _id column (which should be the rowid)
doListView();
return true;
}
});
} else {
mCsr = mydb.getAllData2();
mSCA.swapCursor(mCsr);
}
}
private void addSomeDataForTesting() {
if (DatabaseUtils.queryNumEntries(mydb.getWritableDatabase(),DBHelper.Tname) < 1) {
mydb.addItem("Item 1",25.55);
mydb.addItem("Item 2",50.99);
mydb.addItem("Item 3", 125.35);
}
}
}