使用name_column从sqlitedatabase中的一行中获取所有数据,并将其存储在listview

时间:2018-07-10 18:05:01

标签: android database sqlite android-studio listview

我已经对RecyclerView进行了编码,并在其中使用SearchAdapter从SQLiteDatabase中搜索数据。 MaterialSearchBar(PlaceHolder)仅显示数据库中数据的名称。现在,我想选择一个项目,在搜索栏中选择该项目,并获取该行的所有其他列,并将数据存储在另一活动的列表视图中。

所以我的第一个问题是,如果我只有名字的话,如何从一行中获取所有数据?我应该用游标吗? 我的第二个问题是,我应该如何将来自另一行的所有数据存储在另一个活动的列表视图中?

谢谢您的帮助!

enter cclass SearchViewHolder extends RecyclerView.ViewHolder{

    public TextView medid,name,menge,art,nummer;

    public SearchViewHolder(View itemView) {
        super(itemView);
        medid = (TextView) itemView.findViewById(R.id.medid);
        name = (TextView) itemView.findViewById(R.id.name);
        menge = (TextView) itemView.findViewById(R.id.menge);
        art = (TextView) itemView.findViewById(R.id.art);
        nummer = (TextView) itemView.findViewById(R.id.nummer);
    }
}

public class SearchAdapter extends RecyclerView.Adapter<SearchViewHolder> {

    private Context context;
    private List<Drugs> drugs;

    public SearchAdapter(Context context, List<Drugs> drugs) {
        this.context = context;
        this.drugs = drugs;
    }

    public SearchAdapter() {

    }

    @Override
    public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater =LayoutInflater.from(parent.getContext());
        View itemView = inflater.inflate(R.layout.medikamentensuche,parent,false);
        return new SearchViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(SearchViewHolder holder, int position) {
        //String pharmaId,name,menge,art,preis,code,bezeichnung;
        holder.medid.setText(toString().valueOf(drugs.get(position).getMedID()));
        holder.name.setText(drugs.get(position).getName());
        holder.menge.setText(drugs.get(position).getMenge());
        holder.art.setText(drugs.get(position).getArt());
        holder.nummer.setText(drugs.get(position).getNummer());
    }

    @Override
    public int getItemCount() {
        return drugs.size();
    }
}

DataBaseOpenhelper类

public class DatabaseOpenHelper extends SQLiteAssetHelper {

    private static final String DB_NAME = "medikamente.db";
    private static final String TABLE = "Medikamente";
    private static final int DB_VER = 1;

    public static final String ID = "MedID";
    public static final String NAME = "Handelsname";
    public static final String MENGE = "Mengenangabe";
    public static final String ART = "Mengenart";
    public static final String NUMMER = "Pharmanummer";

    public DatabaseOpenHelper(Context context) {
        super(context, DB_NAME, null, DB_VER);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE);
        onCreate(db);
    }

//neues Medikament hinzufügen
   public boolean insertNewEntry (String name, String mengenangabe, String mengenart, String pharmanummer) {

       SQLiteDatabase db = getWritableDatabase();
       ContentValues values = new ContentValues();
       values.put(NAME,name);
       values.put(MENGE,mengenangabe);
       values.put(ART,mengenart);
       values.put(NUMMER,pharmanummer);
       long result = db.insert("Medikamente",null,values);
       if (result == -1)
           return false;
        else
           return true;
    }

    public List<Drugs> getDrug() {

        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        Log.d("in der DrugDatabases", "SQLiteQueryBuilder successful");


        //Kathi habe hier: "ATCCode", "BezeichnungATCCode" gelöscht
        String [] sqlSelect = {"MedID", "Handelsname", "Mengenangabe", "Mengenart", "Pharmanummer"};
        String tableName = "Medikamente";
        Log.d("in der DrugDatabases", " successful" + sqlSelect);

        qb.setTables(tableName);
        Cursor cursor = qb.query(db, sqlSelect, null, null, null, null, null);
        List<Drugs> result = new ArrayList<>();
        if(cursor.moveToFirst()) {

            do{
                Drugs drug = new Drugs();
                drug.setMedID(cursor.getInt(cursor.getColumnIndex("MedID")));
                drug.setName(cursor.getString(cursor.getColumnIndex("Handelsname")));
                drug.setMenge(cursor.getString(cursor.getColumnIndex("Mengenangabe")));
                drug.setArt(cursor.getString(cursor.getColumnIndex("Mengenart")));
                drug.setNummer(cursor.getString(cursor.getColumnIndex("Pharmanummer")));

                result.add(drug);

            }while (cursor.moveToNext());
        }return result;
    }

    public List<String> getNames() {

        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

        String [] sqlSelect = {"Handelsname" };
        String tableName = "Medikamente";

        qb.setTables(tableName);
        Cursor cursor = qb.query(db, sqlSelect, null, null, null, null, null);
        List<String> result = new ArrayList<>();
        if(cursor.moveToFirst()) {

            do{
                result.add(cursor.getString(cursor.getColumnIndex("Handelsname" )));
            }while (cursor.moveToNext());
        }return result;
    }

    public List<Drugs> getDrugsByName(String name) {

        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

        String [] sqlSelect = {"MedID" ,"Handelsname" ,"Mengenangabe" ,"Mengenart" ,"Pharmanummer"};
        String tableName = "Medikamente";

        qb.setTables(tableName);
        Cursor cursor = qb.query(db, sqlSelect, "Handelsname LIKE ?",new String[]{"%"+name+"%"}, null, null, null);
        List<Drugs> result = new ArrayList<>();
        if(cursor.moveToFirst()) {

            do{
                Drugs drug = new Drugs();
                drug.setMedID(cursor.getInt(cursor.getColumnIndex("MedID")));
                drug.setName(cursor.getString(cursor.getColumnIndex("Handelsname")));
                drug.setMenge(cursor.getString(cursor.getColumnIndex("Mengenangabe")));
                drug.setArt(cursor.getString(cursor.getColumnIndex("Mengenart")));
                drug.setNummer(cursor.getString(cursor.getColumnIndex("Pharmanummer")));

                result.add(drug);

            }while (cursor.moveToNext());
        }return result;
    }
}

MedzhiActivity

public class MedSucheActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    SearchAdapter adapter;
    TextView textView;



    MaterialSearchBar materialSearchBar;
    List<String> suggestList = new ArrayList<>();

    DatabaseOpenHelper database;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_medsuchen);

        Button button = (Button) findViewById(R.id.hinzufügen);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),MedTableActivity.class);
                TextView suche = (TextView) findViewById(R.id.SuchMedikament);
                intent.putExtra("weitergabe",suche.getText().toString());
                startActivityForResult(intent,1);
                //wichtig wenn man Daten zurück geben will von der 2.Activity
            }
        });
        textView = (TextView) findViewById(R.id.SuchMedikament);
        recyclerView = (RecyclerView) findViewById(R.id.recycler_search);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);


        materialSearchBar = (MaterialSearchBar) findViewById(R.id.search_bar);
        //textView = (TextView) findViewById(R.id.versuch);

        //Datenbank
        database = new DatabaseOpenHelper(this);

        //Searchbar
        materialSearchBar.setHint("Search");
        materialSearchBar.setCardViewElevation(10);
        loadSuggestList();
        materialSearchBar.addTextChangeListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                List<String> suggest = new ArrayList<>();
                for(String search:suggestList) {
                   if (search.toLowerCase().contains(materialSearchBar.getText().toLowerCase()))
                       suggest.add(search);




                }
                materialSearchBar.setLastSuggestions(suggest);

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
            @Override
            public void onSearchStateChanged(boolean enabled) {
                if(!enabled)
                    recyclerView.setAdapter(adapter);
            }

            @Override
            public void onSearchConfirmed(CharSequence text) {
                startSearch(text.toString());
            }

            @Override
            public void onButtonClicked(int buttonCode) {

            }
        });

        //init Adapter default set all result
        adapter = new SearchAdapter(this,database.getDrug());
        recyclerView.setAdapter(adapter);

    }

    private void startSearch(String text) {

       adapter = new SearchAdapter(this,database.getDrugsByName(text));
        recyclerView.setAdapter(adapter);
    }

    private void loadSuggestList() {
        suggestList = database.getNames();
        materialSearchBar.setLastSuggestions(suggestList);
    }

    public void onHinzuClick(View v) {
        Log.d("msg","Auf Hinzufügen Button geklickt");
        Intent intent = new Intent (getBaseContext(),MedikamentHinzufugenActivity.class);
        startActivity(intent);
    }

}

1 个答案:

答案 0 :(得分:0)

  
      
  1. 所以我的第一个问题是,如果我要如何从一行中获取所有数据   只有名字吗?

  2.   
  3. 第二个问题是,我应该如何存储其中的所有数据   

  

如果 name 肯定是唯一的(看起来可能不是唯一的),则可以将其与{{ 1}}方法来获取毒品对象的列表(如果名称是唯一的,则为1)。因此,只需 getDrugsByName ,就可以通过Intent Extra将其传递给另一个活动,并从Intent Extra中检索出来,然后可以使用name方法然后在该活动中获取该行的所有数据( 2。)。当然,您也可以通过Intent Extras传递所有值。

如果名称不一定是唯一的,则可以使用 getDrugsbyName (列 MedId )(假设(它是表的主键,因此是唯一的),而不是名称。您可能在DatabaseHelper类中有一个方法ID,沿着( for 2 )的方式:-

getDrugById
  • 注释
    • 应检查返回值的MedID是否为-1,这表明不存在与传递的ID匹配的行。
    • 使用类中定义的CONSTANTS不会冒犯错误的名称(您可能希望在整个过程中采用它)。
    • 完成操作后应始终关闭游标,否则可能会发生异常。
    • 以上内容假定ID列是PRIMARY KEY,并且是 rowid 列的别名。那就是您有public Drugs getDrugById(long id) { SQLiteDatabase db = getReadableDatabase(); Drugs rv = new Drugs(); rv.setMedID(-1); // set so that drug not found can be determined String whereclause = ID + "=?"; String[] whereargs = new String[]{String.valueOf(id)}; Cursor csr = db.query(TABLE,null,whereclause,whereargs,null,null,null); if (csr.moveToFirst()) { rv.setMedID(id); rv.setName(csr.getString(csr.getColumnIndex(NAME))); rv.setMenge(csr.getString(csr.getColumnIndex(MENGE))); rv.setArt(csr.getString(csr.getColumnIndex(ART))); rv.setNummer(csr.getString(csr.getColumnIndex(NUMMER))); } csr.close(); return rv; } ID INTEGER PRIMARY KEY
    • 上面假设ID列的用法正确,即,将它视为long而不是int (只要行受到限制,int可以,但是SQLite允许rowid高达9223372036854775807,这不能由int处理)
    • 这是通常的方法,因为使用 rowid 的别名可能是最有效的。
相关问题
最新问题