возникли проблемы с извлечением базы данных Android sqlite - PullRequest
0 голосов
/ 29 октября 2018

Я делаю таблицу в Android, где у меня есть 2 столбца. Первый столбец - это имя элемента, а второй - itemprice. Я подключил все к базе данных. Я сделал хорошую альтернативу: сделать столбец с именем элемента как текстовое представление автозаполнения и подключить его к списку, который в дальнейшем подключен к базе данных (которая скрыта). Итак, я получаю названия предметов ... теперь я хочу, чтобы каждый раз, когда я добавлял наименование товара в столбец, цены из базы данных соответствующего предмета автоматически извлекаются в столбец ... пожалуйста, помогите мне, я застрял с ним с прошлого месяца

 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();
                                           }
                                       }
                                   });

1 Ответ

0 голосов
/ 29 октября 2018

Одна из областей, в которых вы идете не так, как надо, или излишне усложняете дела, находится в вашем onItemClick Listsner.

Следующий ответ является рабочим примером, в котором используется адаптер Cursor ( SimpleCursorAdapter ) и показаны оба столбца Itemname и Itemprice. Кроме того, нажатие на элемент Toast все значения и длительный щелчок удаляют элемент и обновляют ListView.

Однако для адаптеров курсора требуется имя столбца _id , и он ожидает, что это будет значение столбца rowid . Столбец rowid - это специальный столбец, который однозначно идентифицирует строку, но обычно скрыт. Запрос в коде, который возвращает Cursor (метод getAllData2 ), использует это (в основном, выбранный SQL - SELECT rowid AS _id, * FROM the_table).

Так как основным источником является Курсор, позиционированный Курсор доступен для вас и, следовательно, все значения. Так что вам не нужно искать, вы просто получаете значения из курсора. Дополнительным 4-м параметром для onItemClick / onItemLongClick является значение в столбце _id ( rowid ), и его можно использовать для поиска конкретной строки (в примере onItemLongClick использует это для удаление строки).

Помощник по базам данных DBHelper.java : -

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);
    }
}
  • Примечание. BaseColumns._ID преобразуется в _id , поэтому String[] columns = new String[]{"rowid AS " + BaseColumns._ID,"*"}; создает массив строк из 2 элементов, первый элемент которого имеет rowid AS _id, второй - * (все столбцы).

MainActivity.java : -

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...