2012-06-05 2 views
0

Je vais commencer par énumérer le code que j'ai jusqu'ici ...Comment puis-je obtenir une base de données SQLite statique pour montrer dans mon listView

Ceci est ma principale classe d'activité:

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

    } 

} 

C'est ma classe 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)); 
} 

} 

Ceci est ma classe 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; 
} 

} 

Ma classe DatabaseAdapter est vide pour le moment. C'est ce que je dois comprendre !:

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; 
} 

} 

Puis-je avoir un fichier XML qui stocke tous les articles d'épicerie par le nom et le type:

<?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> 

Et enfin j'ai un row.xml C'est juste deux textViews qui doivent afficher le nom et le type de chaque élément dans chaque ligne de ma ListView.

Mon principal.xml est juste un TextView et un listview.

Ce que je suis vraiment bloqué sur l'adaptateur. J'ai utilisé des adaptateurs de bases de données avant d'insérer des lignes dans une base de données via editTexts et un objet support, mais je n'ai jamais simplement pris une base de données statique et l'ai converti en View à travers ViewView. Quelqu'un at-il des indications sur ce qui est nécessaire pour que ma base de données soit consultée via un listView ?? Toute aide serait grandement appréciée car je suis complètement perplexe ici. Je me suis creusé la cervelle depuis quelques heures en essayant de trouver comment faire ça. Merci pour toute aide!

+0

D'après ce que vous avez dit, je ne comprends pas pourquoi vous pensez besoin d'un adaptateur personnalisé ... un 'SimpleCursorAdapter' fonctionnera très bien autant que je peux dire. – Barak

+0

supprime cette ligne 'helper.populateGrocery (db);' de votre init et la déplace vers public void onCreate (SQLiteDatabase db) 'dans votre classe DatabaseHelper après l'instruction create. Cela vous permettra de remplir votre base de données une seule fois et pas à chaque démarrage de votre application. – Woodsy

Répondre

0

SimpleAdapter est destiné aux données statiques, de sorte que vos performances peuvent varier si vous utilisez des données dynamiques. L'autre façon est probablement d'utiliser un autre type d'adaptateur si vous souhaitez utiliser des données dynamiques, telles que ArrayAdapter.

0

Vous n'avez pas besoin d'utiliser un CursorAdapter, un simple ArrayAdapter suffira. Stocker simplement vos résultats à partir de votre requête de base de données dans une ArrayList (que vous faites déjà), puis passez cette liste dans le constructeur de votre carte. Votre adaptateur de tableau doit être capable d'accepter une liste de type GroceryObj, alors vous pouvez appeler GroceryObj.getName() ou getType() pour remplir votre ListView

Questions connexes