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

Posted

技术标签:

【中文标题】从 sqlitedatabase 的一行中以 name_column 获取所有数据并将其存储在 listview 中【英文标题】:Get all the data from one row in sqlitedatabase with the name_column and store it in listview 【发布时间】:2018-12-18 16:14:04 【问题描述】:

我编写了一个 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;
    

MedSucheActivity

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】:

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

    我的第二个问题是,我应该如何存储其中的所有数据 另一个活动中的列表视图中的一行?

如果 name 肯定是唯一的,但看起来可能不是,那么您可以将它与getDrugsByName 方法结合使用获取 Drug 对象的列表(如果名称是唯一的,则为 1)。所以 name 是所有需要的,这可以通过 Intent Extra 传递给另一个活动,从而从该 Intent Extra 中检索,然后您可以在该活动中使用 getDrugsbyName 方法来然后获取该行的所有数据(for 2.)。当然,您也可以通过 Intent Extras 传递所有值。

如果 name 不一定是唯一的,那么您可以使用 MedId(列 ID)(假设它是 PRIMARY表的 KEY,因此是唯一的)而不是 name。您可能在 DatabaseHelper 类中有一个方法 getDrugById,类似于 (for 2.) :-

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;
   
注意事项 应检查返回的值是否 MedID 为 -1,这表明没有与传递的 id 匹配的行。 已经使用了类中定义的 CONSTANTS,而不是冒着错误输入名称的风险(您可能希望始终采用这一点)。 游标完成后应始终关闭,否则可能会发生异常。 以上假设 ID 列是 PRIMARY KEY 并且它是 rowid 列的别名。那就是你有ID INTEGER PRIMARY KEYID INTEGER,..other columns.., PRIMARY KEY (ID) 以上假设正确使用 ID 列,即它被视为 long 而不是 int (只要行数有限,int 就可以,但是 SQLite 允许 rowid 高达 9223372036854775807,这不能由 int 处理)。 这是通常的方法,因为使用 rowid 的别名可能是最有效的。

【讨论】:

以上是关于从 sqlitedatabase 的一行中以 name_column 获取所有数据并将其存储在 listview 中的主要内容,如果未能解决你的问题,请参考以下文章

从数据框中删除所有值为 NA 的列

在将数据从文件插入表时,如何用 NULL 替换 NA 值?

SQLiteQueryBuilder.query()vs SQLiteDatabase.query()

使用 R 和 tidyr() 从 NA 中提取文本

在 SQLiteDatabase.query() 中使用 String[] selectionArgs

Jquery——选择器2