2013-03-12 145 views
3

虽然这个问题在这里已经问了很多次,但我找不到适合我的代码的正确答案。我意识到这可能是小事,但我似乎无法找到问题,因为我只是真的很陌生。将SQLite数据库中的数据显示在Android的ListView中

这里是我的代码getClientNamesDatabaseHelper类:

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。

这里的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); 
+0

你为什么不只是光标返回? – njzk2 2013-03-12 14:17:17

+0

是的,我会给出一个去,只是相当新的,所以不太确定正确的语法。谢谢你的帮助。 – Confucius 2013-03-12 21:04:56

回答

0

如果你想返回从dbHelper光标,你可以做这样的事情......

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

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

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

+0

感谢您的帮助,我看了一遍教程,真的很有帮助,欢呼! – Confucius 2013-03-12 21:15:35

+0

没问题。如果你感到高兴,随时将其标记为答案。 – MrChaz 2013-03-13 09:20:24

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); 
+0

谢谢Zabador,感谢您的帮助。我现在用我的值返回'string'数组,但不幸的是我仍然无法在我的ListView中显示任何东西。这里是我正在使用的代码来尝试这样做。 – Confucius 2013-03-13 21:45:12

+0

我已经改变了我的代码来显示数据,这与你在这里的内容一致。我想在这里展示它,但似乎没有能力,所以编辑了我的原始问题并将其添加到了底部。如果任何人可以看看,并提供任何意见,我在做什么错我会很感激。 – Confucius 2013-03-13 23:04:01

+0

您可以显示您为您制作的新代码DBUserAdapter类吗? – Zabador 2013-03-14 15:55:30

相关问题