将SQLite数据库中的数据显示到Android中的ListView中

时间:2013-03-12 14:05:10

标签: java android sqlite

虽然这里已经多次询问过这个问题,但我找不到合适的答案来适应我的代码。我意识到它可能很小,但我似乎无法找到问题,因为我只是真的很新。

以下是 DatabaseHelper 类中的代码 getClientNames

public Cursor getSitesByClientname(String id) {
    String[] args={id};

Cursor myCursor = db.rawQuery("SELECT client_sitename FROM " + CLIENT_SITES_TABLE + " WHERE client_id=?", args);
        String results = "";
        /*int count = myCursor.getCount();
        String[] results = new String[count + 1];
        int i = 0;*/

         if (myCursor != null) {           
                if(myCursor.getCount() > 0)
                {   
                    for (myCursor.moveToFirst(); !myCursor.isAfterLast(); myCursor.moveToNext())
                    {
                        results = results + myCursor.getString(myCursor.getColumnIndex("client_sitename")); 
                    }
                }
            }
            return results;
}

一个问题是我正在向'Cursor'返回一个'String',但是我不确定这是什么最好的方法,因为我认为我应该返回一个Cursor。

以下是我要显示数据的 ClientSites 类:

public class ClientSites extends Activity {

//public final static String ID_EXTRA="com.example.loginfromlocal._ID";

        private DBUserAdapter dbHelper = null;
    private Cursor ourCursor = null;
    private Adapter adapter=null;


    @SuppressWarnings("deprecation")
    @SuppressLint("NewApi")
    public void onCreate(Bundle savedInstanceState) {
        try
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.client_sites);

            Intent i = getIntent();
            String uID = String.valueOf(i.getIntExtra("userID", 0));

            ListView myListView = (ListView)findViewById(R.id.myListView);

            dbHelper = new DBUserAdapter(this);

            //dbHelper.createDatabase();

            dbHelper.openDataBase();

            ourCursor = dbHelper.getSitesByClientname(uID);
            Log.e("ALERT", uID.toString());

            startManagingCursor(ourCursor);
            Log.e("ERROR", "After start manage cursor: ");

            //@SuppressWarnings("deprecation") 
            //SimpleCursorAdapter adapter = new SimpleCursorAdapter(getBaseContext(), R.id.myListView, null, null, null);
            CursorAdapter adapter = new SimpleCursorAdapter(this, R.id.myListView, null, null, null, 0);
            adapter = new Adapter(ourCursor);

            //Toast.makeText(ClientSites.this, "Booo!!!", Toast.LENGTH_LONG).show();

            myListView.setAdapter(adapter);

            myListView.setOnItemClickListener(onListClick);


        }
        catch (Exception e)
        {
            Log.e("ERROR", "XXERROR IN CODE: " + e.toString());
            e.printStackTrace();
        } 

    }

    private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent,
                                View view, int position,
                                long id) 
        {
            Intent i=new Intent(ClientSites.this, InspectionPoints.class);

            i.putExtra(ID_EXTRA, String.valueOf(id));
            startActivity(i);

        }
    };


    class Adapter extends CursorAdapter {
        @SuppressWarnings("deprecation")
        Adapter(Cursor c) {
          super(ClientSites.this, c);
        }

        //@Override
        public void bindView(View row, Context ctxt,
                           Cursor c) {
            Holder holder=(Holder)row.getTag();
            holder.populateFrom(c, dbHelper);
        }
        @Override
        public View newView(Context ctxt, Cursor c,
                           ViewGroup parent) {
          LayoutInflater inflater=getLayoutInflater();
          View row = inflater.inflate(R.layout.row, parent, false);
          Holder holder=new Holder(row);
          row.setTag(holder);
          return(row);
        }
      }

    static class Holder {
        private TextView name=null;

        Holder(View row) {
            name=(TextView)row.findViewById(R.id.ingredientText);
        }

        void populateFrom(Cursor c, DBUserAdapter r) {
            name.setText(r.getName(c));
        }
    }
}

以下是我现在用来尝试在Listview中显示数据的代码。我从原来的尝试中改变了一些,但仍然不确定我做错了什么。

public void onCreate(Bundle savedInstanceState) {
        try
        {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.client_sites);

            Intent i = getIntent();
            String uID = String.valueOf(i.getIntExtra("userID", 0));
            //int uID = i.getIntExtra("userID", 0);

            //ListView myListView = (ListView)findViewById(R.id.myListView);

            dbHelper = new DBUserAdapter(this);

            dbHelper.createDatabase();

            dbHelper.openDataBase();

            String[] results = dbHelper.getSitesByClientname(uID);

            //setListAdapter(new ArrayAdapter<String>(ClientSites.this, R.id.myListView, results));
            //adapter = new ArrayAdapter<String>(ClientSites.this, R.id.myListView, results);
            setListAdapter(new ArrayAdapter<String>(ClientSites.this, R.layout.client_sites, results));

            //ListView myListView = (ListView)findViewById(R.id.myListView);
            ListView listView = getListView();
            listView.setTextFilterEnabled(true);

            //ourCursor = dbHelper.getSitesByClientname(uID);
            //Log.e("ALERT", uID.toString());

            //startManagingCursor(ourCursor);
            //Log.e("ERROR", "After start manage cursor: ");

            //@SuppressWarnings("deprecation") 
            //SimpleCursorAdapter adapter = new SimpleCursorAdapter(getBaseContext(), R.id.myListView, null, null, null); // LOOK AT THIS IN THE MORNING!!!!!!!!!!! 
            //CursorAdapter adapter = new SimpleCursorAdapter(this, R.id.myListView, null, null, null, 0);
            //adapter = new Adapter(ourCursor);

            //Toast.makeText(ClientSites.this, "Booo!!!", Toast.LENGTH_LONG).show();

            //myListView.setAdapter(adapter);

            //myListView.setOnItemClickListener(onListClick);

2 个答案:

答案 0 :(得分:2)

我从数据库创建了一个Listview。这是我用于我的应用程序的代码

这是数据库处理程序的一部分。它将返回我的列表视图的类别列表。如果这是你需要的,它可以返回一个字符串列表。

public List<Category> getAllCategorys() {
        ArrayList<Category> categoryList = new ArrayList<Category>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_CATEGORY;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // looping through all rows and adding to list
        try{
            if (cursor.moveToFirst()) {
                do {
                    Category category = new Category();
                    category.setID(Integer.parseInt(cursor.getString(0)));
                    category.setCategory(cursor.getString(1));
                    // Adding category to list
                    categoryList.add(category);
                } while (cursor.moveToNext());
            }   
        }finally{
            cursor.close();
        }   
        db.close();
        // return category list
        return categoryList;

以下是我通过调用数据库填充ListView的方法。

int size = db.getCategoryCount();
List<Category> categoryList = db.getAllCategorys();

category_data = new String[size-1];
int i=0;
for(Category cn : categoryList)
{   
    category_data[i] = cn.getCategory(); // get the name of the category and add it to array
    i++;   
} 

listAdapter = new ArrayAdapter<String>(this, R.layout.categoryrow, category_data);
listViw.setAdapter(listAdapter);

编辑:这是适合您的事情

public List<String> getSitesByClientname(String id) {
    String[] args={id};
    ArrayList<String> result = new ArrayList<String>();
    SQLiteDatabase db = this.getWritableDatabase();

    Cursor myCursor = db.rawQuery("SELECT client_sitename FROM " + CLIENT_SITES_TABLE +      " WHERE client_id=?", args);

    try{
       if (myCursor.moveToFirst()){
           do{
              result.add(myCursor.getString(myCusor.getString(myCursor.getColumnIndex("client_sitename"));
           }while(myCursor.moveToNext());
        }
    }finally{
         myCursor.close();
    }
    db.close();
    return result;
}

像这样使用

List<String> sites_data = dbHelper.getSitesByClientname(uID);

result_data = new String[sites_data.size()];
int i=0;
for(String s : sites_data)
{   
    result_data[i] = s; // get the name of the category and add it to array
    i++;   
} 

listAdapter = new ArrayAdapter<String>(this, R.layout.client_sites, result_data);
listViw.setAdapter(listAdapter);

答案 1 :(得分:1)

如果你想从dbHelper返回Cursor,你可以这样做......

public Cursor getSitesByClientname(String id) {
    String[] args={id};

return db.rawQuery("SELECT client_sitename FROM " + CLIENT_SITES_TABLE + " WHERE client_id=?", args);
}

我还需要一些时间来阅读listview tutorial