【问题标题】:Most effective ways to extract Android Cursor (sqlite) into an array to be used in AlertDialog.Builder?将Android光标(sqlite)提取到数组中以在AlertDialog.Builder中使用的最有效方法?
【发布时间】:2015-08-02 07:31:26
【问题描述】:

我想知道从 android SQLite 数据库游标中提取数据到数组中的最有效方法。 问题是当我使用列表对话框(AlertDialog.Builder.setItems)时,项目是set from an array。要生成数组,我需要遍历光标的每一行并根据值重新生成新数组,并且需要 非常长 时间来处理。

也许我遗漏了诸如 c++ std::vector 或 python 的列表之类的东西,我可以在其中快速推送/追加和弹出。我想知道人们如何处理从数据库中获取数据并保持快速处理的列表对话框。谢谢

//-- Draw all list of base account
    dbv_accounts = db.rawQuery("SELECT * FROM accounts WHERE type='BASE'",null);
    CharSequence[] accounts_list = {};
    if (dbv_accounts.getCount()>0)
        while (dbv_accounts.moveToNext()) //-- cursor starts from -1
        {
            CharSequence[] new_accountl = new CharSequence[accounts_list.length + 1];
            System.arraycopy(accounts_list, 0, new_accountl, 0, accounts_list.length);
            new_accountl[accounts_list.length] = dbv_accounts.getString(dbv_accounts.getColumnIndex("name"));
            accounts_list = new_accountl;
        }
    db.close();
    final CharSequence[] finalAccounts_list = accounts_list;
    bt_Cba_Baseaccount.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(ChangebaseaccountActivity.this);
                    builder.setTitle("Pick Base Account Name");
                    builder.setItems(
                            finalAccounts_list,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int item){
                                    bt_Cba_Baseaccount.setText(finalAccounts_list[item]);
                                    String ba = finalAccounts_list[item].toString();
                                }
                            }
                    );
                    builder.show();
                }
            }
    );

【问题讨论】:

    标签: java android arrays performance sqlite


    【解决方案1】:

    对于寻找解决方案的他们来说,简单的解决方案是使用 ArrayList 并将其转换为数组。它比为每行光标读取生成新数组要快得多

    //-- Draw all list of base account
        SQLiteDatabase db = openOrCreateDatabase(getResources().getString(R.string.databasename),MODE_PRIVATE,null);
        Cursor dbv_accounts = db.rawQuery("SELECT * FROM accounts WHERE type='BASE'",null);
        //-- Make ArrayList and push every needed row value
        ArrayList<CharSequence> ALaccounts_list = new ArrayList<CharSequence>();
        while (dbv_accounts.moveToNext())
        {
            String row = dbv_accounts.getString(dbv_accounts.getColumnIndex("name"));
            ALaccounts_list.add(row);
        }
        db.close();
    

    然后将 ArrayList 转换为数组

      CharSequence[] accounts_list = new CharSequence[ALaccounts_list.size()];
      accounts_list = ALaccounts_list.toArray(accounts_list);
      final CharSequence[] finalAccounts_list = accounts_list; 
    

    数组已准备好在 AlertDialog.Builder.setItems 中使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      相关资源
      最近更新 更多