2012-06-05 1 views
0

Начну с перечисления на код, который я до сих пор ...Как я могу получить статическую базу данных SQLite, чтобы показать в моей ListView

Это мой основной класс активность:

public class SQLiteDatabaseMain extends Activity 
{ 
    ListView list; 
    DatabaseHelper helper; 
    SQLiteDatabase db; 
    DatabaseAdapter adapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     init(); 
    } 

    public void init() 
    { 
     helper = new DatabaseHelper(this); 

     list = (ListView) findViewById(R.id.listView1); 

     db = helper.getWritableDatabase(); 

     helper.populateGrocery(db); 

    } 

} 

Это мой DatabaseHelper класс:

public class DatabaseHelper extends SQLiteOpenHelper 
{ 

private static final String DATABASE_NAME = "grocerystoretest.db"; 
private static final String DATABASE_TABLE = "grocerystoreitems"; 
private static final String GROCERY_KEY_NAME = "name"; 
private static final String GROCERY_KEY_TYPE = "type"; 
private static final int SCHEMA_VERSION = 1; 

SQLiteDatabaseMain sqlMain = new SQLiteDatabaseMain(); 

public DatabaseHelper(Context context) 
{ 
    super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL("CREATE TABLE " 
      + DATABASE_TABLE 
      + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, type TEXT);"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) 
{ 
    // db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME); 

} 

public void insert(String name, String type) 
{ 
    ContentValues cv = new ContentValues(); 
    cv.put("name", name); 
    cv.put("type", type); 

    getWritableDatabase().insert(DATABASE_TABLE, "name", cv); 
} 

public void update(String id, String name, String type) 
{ 
    ContentValues cv = new ContentValues(); 
    String[] args = 
    { id }; 

    cv.put("name", name); 
    cv.put("type", type); 

    getWritableDatabase().update(DATABASE_TABLE, cv, "_ID=?", args); 
} 

public void delete(String id, String name, String type) 
{ 
    ContentValues cv = new ContentValues(); 
    String[] args = 
    { id }; 

    cv.put("name", name); 
    cv.put("type", type); 

    getWritableDatabase().delete(DATABASE_TABLE, "_ID=?", args); 
} 

public void populateGrocery(SQLiteDatabase db) 
{ 
    ArrayList<GroceryObj> groceryArrayList; 
    groceryArrayList = buildGroceryArrayList(); 
    String insertStmt = null; 
    for (int i = 0; i < groceryArrayList.size(); i++) 
    { 
     insertStmt = "INSERT INTO " + DATABASE_TABLE + " (" 
       + GROCERY_KEY_NAME + ", " + GROCERY_KEY_TYPE + ") " 
       + "VALUES (\"" + groceryArrayList.get(i).getName() 
       + "\", \"" + groceryArrayList.get(i).getType() + "\");"; 
     db.execSQL(insertStmt); 
    } 
} 

private ArrayList<GroceryObj> buildGroceryArrayList() 
{ 
    ArrayList<GroceryObj> aL = new ArrayList<GroceryObj>(); 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    try 
    { 
     Context context; 
     context = sqlMain.getApplicationContext(); 

     DocumentBuilder builder = factory.newDocumentBuilder(); 
     InputStream raw = context.getAssets().open("default_grocerystore.xml"); 
     Document dom = builder.parse(raw); 
     Element root = (Element) dom.getDocumentElement(); 
     NodeList groceryItems = ((Document) root) 
       .getElementsByTagName("grocery"); 
     for (int i = 0; i < groceryItems.getLength(); i++) 
     { 
      String name = null; 
      String type = null; 
      Node item = groceryItems.item(i); 
      NodeList groceryItem = item.getChildNodes(); 
      for (int j = 0; j < groceryItem.getLength(); j++) 
      { 
       Node nodeItem = groceryItem.item(j); 
       String nodeName = nodeItem.getNodeName(); 
       if (nodeName.equalsIgnoreCase("name")) 
       { 
        name = nodeItem.getFirstChild().getNodeValue(); 
       } else if (nodeName.equalsIgnoreCase("type")) 
       { 
        type = nodeItem.getFirstChild().getNodeValue(); 
       } 
      } 
      aL.add(new GroceryObj(name, type)); 
     } 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return aL; 
} 

public String getName(Cursor c) 
{ 
    return (c.getString(1)); 
} 

public String getType(Cursor c) 
{ 
    return (c.getString(3)); 
} 

} 

Это мой GroceryObj класс:

public class GroceryObj 
{ 

private String name = ""; 
private String type = ""; 

public GroceryObj(String name, String type) 
{ 
    this.name = name; 
    this.type = type; 
} 

public String getName() 
{ 
    return (name); 
} 

public void setName(String name) 
{ 
    this.name = name; 
} 

public String getType() 
{ 
    return (type); 
} 

public void setType(String type) 
{ 
    this.type = type; 
} 

} 

В настоящее время мой класс DatabaseAdapter пуст. Это то, что мне нужно, чтобы выяснить !:

public class DatabaseAdapter extends CursorAdapter 
{ 

public DatabaseAdapter(Context context, Cursor c) 
{ 
    super(context, c); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) 
{ 

} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) 
{ 
    return null; 
} 

} 

Тогда у меня есть файл XML, который хранит все продовольственными товарами по имени и типу:

<?xml version="1.0" encoding="utf-8"?> 
<default_grocerystore> 
    <grocery> 
      <name>Bread</name> 
      <type>Bakery</type> 
    </grocery> 
    <grocery> 
      <name>Rolls</name> 
      <type>Bakery</type> 
    </grocery> 
    <grocery> 
      <name>Juice</name> 
      <type>Beverages</type> 
    </grocery> 
    <grocery> 
      <name>Soda</name> 
      <type>Beverages</type> 
    </grocery> 
</default_grocerystore> 

И, наконец, у меня есть row.xml это всего лишь два текстовых элемента, которые должны отображать имя и тип каждого элемента в каждой строке моего ListView.

My main.xml - это просто TextView и listview.

Я действительно застрял в адаптере. Ive использовал адаптеры баз данных, прежде чем вставлять строки в базу данных через editTexts и объект-держатель, но Ive никогда не занимался статической базой данных и не преобразовывал его в каждую строку в View через мой listView. У кого-нибудь есть указатели на то, что необходимо для того, чтобы моя база данных просматривалась через listView? Любая помощь будет принята с благодарностью, потому что я полностью здесь. В последние несколько часов я пытаюсь понять, как это сделать. Спасибо за любую помощь!

+0

Из того, что вы сказали, я не понимаю, почему вы думаете, что вы нужен пользовательский адаптер ... «SimpleCursorAdapter» будет работать отлично, насколько я могу судить. – Barak

+0

удалите эту строку 'helper.populateGrocery (db);' из вашего init и переместите ее в 'public void onCreate (SQLiteDatabase db)' в свой класс DatabaseHelper после инструкции create. Это заставит вас заполнять базу данных только один раз, а не каждый раз при запуске приложения. – Woodsy

ответ

0

SimpleAdapter предназначен для статических данных, поэтому ваша производительность может отличаться, если вы собираетесь использовать динамические данные. Другой способ, вероятно, использовать другой тип адаптера, если вы хотите использовать динамические данные, например ArrayAdapter.

0

Вам не нужно использовать CursorAdapter, который сделает простой ArrayAdapter. Просто сохраните свои результаты из запроса базы данных в ArrayList (который вы уже делаете), а затем передайте этот список в конструктор вашего адаптера. Адаптер массива должен иметь возможность принимать arraylist типа GroceryObj, тогда вы можете вызвать GroceryObj.getName() или getType(), чтобы заполнить свой список ListView

Смежные вопросы