2016-04-18 7 views
-1

Ich versuche, SQLite zu verwenden, um Daten für eine Listview zu erhalten und zu setzen. Meine Liste muss Anfangsdaten haben und der Benutzer muss sie bearbeiten können.Wie man Daten mit SQLite in Android erhält und schreibt

Ich habe ein Item-Klasse

public final class Items implements BaseColumns { 
public static final String TABLE_NAME = "items"; 

public static final String COLUMN_NAME_TYPE= "itemType"; 
public static final String COLUMN_NAME_NAME = "itemName"; 
public static final String COLUMN_NAME_CALORIE = "calorie"; 


private long id = -1; 
private String name; 
private String type; 
private int calorie; 

public String getType() { 
    return type; 
} 

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

public Items(String type,String name, int score) { 
    this.name = name; 
    this.type=type; 
    this.calorie = calorie; 

} 
public String getName() { 
    return name; 
} 

public int getCalorie() { 
    return calorie; 
} 

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

public void setId(long id) { 
    this.id = id; 
} 

public void setCalorie(int calorie) { 
    this.calorie = calorie; 
} 


public long getId() { 
    return id; 
} 


public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append("Item [id="); 
    builder.append(id); 
    builder.append(", name="); 
    builder.append(name); 
    builder.append(", calorie="); 
    builder.append(calorie); 
    builder.append("]"); 
    return builder.toString(); 
} 

}

Dann eine DB-Hilfsklasse I erstellt, die alle Methoden, die ich brauche. (Beachten Sie, dass es eine chaotische Klasse ist. Während ich habe Schwierigkeiten für Datenbank immer Daten, die ich viele Dinge geändert.)

public class DatabaseHelper extends SQLiteOpenHelper { 

    private static final String DB_NAME = "items.db"; 
    private static final int DB_VERSION = 1; 


    public DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 

    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + Items.TABLE_NAME + " (" 
       + Items._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
       + Items.COLUMN_NAME_TYPE + " TEXT," 
       + Items.COLUMN_NAME_NAME + " TEXT," 
       + Items.COLUMN_NAME_CALORIE + " INTEGER" + ");"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + Items.TABLE_NAME); 
     onCreate(db); 
    } 

    public void createItem(Items item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 

     values.put(Items.COLUMN_NAME_NAME, item.getName()); 
     values.put(Items.COLUMN_NAME_TYPE, item.getName()); 
     values.put(Items.COLUMN_NAME_CALORIE, item.getCalorie()); 


     item.setId(db.insert(Items.TABLE_NAME, null, values)); 
     db.close(); 
    } 


    public Cursor getItemsTypeOf(String type){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String[] tableColumn=new String[]{Items.COLUMN_NAME_TYPE, Items.COLUMN_NAME_NAME, Items.COLUMN_NAME_CALORIE}; 
     String whereClause= Items.COLUMN_NAME_TYPE+"="+type; 

    //   +" FROM "+Items.TABLE_NAME 
     //   +"WHERE "+Items.COLUMN_NAME_TYPE+"="+type; 
     Cursor cur=db.query(Items.TABLE_NAME,tableColumn,whereClause,null,null,null,null); 

     return cur; 

    } 
    public Cursor fetchAllItems() { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cur= db.query(Items.TABLE_NAME, new String[]{ 
         Items.COLUMN_NAME_TYPE, Items.COLUMN_NAME_NAME, Items.COLUMN_NAME_CALORIE, 
       }, null, null, null, null, 
       Items.COLUMN_NAME_CALORIE + " DESC"); 
     db.close(); 
     return cur; 

    } 
    public Items getItem(long id){ 

     SQLiteDatabase db = this.getReadableDatabase(); 


     Cursor cursor = 
       db.query(Items.TABLE_NAME, 
         null, 
         Items._ID+ "=?", 
         new String[] { String.valueOf(id) }, 
         null, 
         null, 
         null); 


     if(cursor!=null&&cursor.moveToFirst()) { 
      Items item = new Items(cursor.getString(1), cursor.getString(2), 
        cursor.getInt(3)); 
      item.setId(cursor.getLong(0)); 

      cursor.close(); 


      db.close();; 
      return item; 
     } 
     cursor.close(); 


     db.close();; 
     return null; 
    } 

} 

Also meine Anwendungskategorien bei mainActivity haben als jede Kategorie abgestimmt Daten analysieren werden und zeigen ein Liste davon. Hier

ist MainActivity

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     DatabaseHelper dbHelper = new DatabaseHelper(this); 
     dbHelper.createItem(new Items("Breakfast","egg",23)); 



    } 
    public void onBreakfastSelected(View view) { 
     startActivity(new Intent(this, ListActivity.class)); 
    } 

} 

Und andere Liste Klasse, die Elemente der Kategorie zeigt.

 public class ListActivity extends Activity implements AdapterView.OnItemClickListener { 


    ArrayAdapter<String> adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list); 

     ListView list = (ListView) findViewById(R.id.listView); 
     list.setOnItemClickListener(this); 
     DatabaseHelper dbHelper = new DatabaseHelper(this); 
     dbHelper.createItem(new Items("a", "a", 12)); 

     Items item=dbHelper.getItem(-1); 
     //System.out.print(); 
     adapter.add(item.getName()); 
     list.setAdapter(adapter); 

    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    } 
} 

Ich kann keine Daten erhalten, die ich eingefügt habe. Es gibt mir einen Fehler, wenn ich versuchte, getItem-Methode zu verwenden. Außerdem weiß ich nicht, wie man Cursor in verschiedene Daten trennt, um sie zu Listen zu analysieren, nachdem ich den Cursor in der Methode getItemsTypeOf gefunden habe.

+0

Welche Fehler bekommen Sie eigentlich? –

Antwort

0

Sie benötigen grundsätzlich 5 Komponenten.

Eine Aktivität, die das Layout, das die ListView enthält, anzeigt/verwendet. Sie haben ListActivity.

Ein Layout, das die ListView enthält. Sie haben activity_list (ich nehme an, wie Sie es verweisen).

Ein Mittel, um die Daten aus der Datenbank zu erhalten. Sie haben fetchAllItems(). Beachten Sie dies, es sei denn, Sie möchten Komplexitäten einführen, MUSS eine Spalte namens _id haben. Obwohl Sie die Spalte definiert haben, gibt fetchAllItems diese Spalte nicht aus. Sie könnten dies ändern, um * (alle Spalten) anstelle von benannten Spalten zu verwenden oder _ID als benannte Spalte einzuschließen.

Ein Layout für jede Zeile/Eintrag/Element der ListView. Sie scheinen dies nicht zu haben. Es ist ein ziemlich einfaches Layout.

Zuletzt benötigen Sie einen geeigneten Adapter. Ein Cursor-Adapter wäre für einen Cursor geeignet. Es gibt einen einfachen Cursor Adapater. Allerdings habe ich noch nie eines benutzt. Ich habe immer Custom Cursor Adapter verwendet, die ziemlich einfach sind. Sie scheinen keinen solchen Adapter zu haben.

Ich werde zu gegebener Zeit einige Beispiele hinzufügen.

Beispiel 1 - Layout, das Listview umfasst (Ich habe einen Coupé von Tasten links): -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/aslbc_layout" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="@dimen/standard_dummy_size" 
    android:layout_marginTop="@dimen/activity_vertical_margin" 
    android:layout_marginBottom="@dimen/activity_vertical_margin" 
    android:layout_marginLeft="@dimen/activity_horizontal_margin" 
    android:layout_marginRight="@dimen/activity_horizontal_margin" 
    android:descendantFocusability="beforeDescendants" 
    tools:context="mjt.shopper.ShopListByCursorActivity"> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_button_height" 
     android:layout_margin="@dimen/standard_dummy_size"> 
     <Button 
      android:id="@+id/aslbcbtn01" 
      android:layout_width="@dimen/standard_button_width" 
      android:layout_height="@dimen/standard_button_height" 
      android:text="@string/standarddonebutton" 
      android:textColor="@color/colorNormalButtonText" 
      android:textStyle="bold" 
      android:backgroundTint="@color/colorNormalButton" 
      android:onClick="aslbcDone"> 
     </Button> 
     <Button 
      android:id="@+id/aslbcbtn02" 
      android:layout_width="@dimen/standard_button_width" 
      android:layout_height="@dimen/standard_button_height" 
      android:text="@string/standardaddbuttontext" 
      android:textStyle="bold" 
      android:textColor="@color/colorNormalButtonText" 
      android:backgroundTint="@color/colorNormalButton" 
      android:onClick="aslbcAddShop"> 
     </Button> 
    </LinearLayout> 

    <ListView 
     android:id="@+id/aslbclv01" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_listview_height" 
     android:longClickable="true"> 
    </ListView> 
</LinearLayout> 

Beispiel 2 - Layouts für jedes Element (Eintrag oder Zeile)(Beachten Sie, dass ich habe Sichtbarkeit für Felder gegangen gesetzt Dies liegt daran, das noch in Entwicklung befindet und es macht es einfach für mich, um sie zu aktivieren, wenn ich brauche): -.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/standard_listview_row_height" 
    android:padding="0dp" 
    android:background="@color/colorlistviewroweven" 
    tools:context=".ShopListEntryActivity"> 
    <TextView 
     android:id="@+id/shop_id_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:layout_weight="0" 
     android:singleLine="true" 
     android:textSize="@dimen/standard_listview_text_size" 
     android:textStyle="italic" 
     android:visibility="gone"/> 
    <TextView 
     android:id="@+id/shop_name_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:layout_weight="0.3" 
     android:singleLine="true" 
     android:textSize="@dimen/standard_listview_text_size" 
     android:textStyle="bold" /> 
    <TextView 
     android:id="@+id/shop_order_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:textSize="@dimen/standard_listview_text_size" 
     android:visibility="gone"/> 
    <TextView 
     android:id="@+id/shop_city_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:layout_weight="0.3" 
     android:singleLine="true" 
     android:textSize="@dimen/standard_listview_text_size"/> 
    <TextView 
     android:id="@+id/shop_street_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:layout_weight="0.4" 
     android:singleLine="true" 
     android:textSize="@dimen/standard_listview_text_size"/> 
    <TextView 
     android:id="@+id/shop_state_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:textSize="@dimen/standard_listview_text_size" 
     android:visibility="gone"/> 
    <TextView 
     android:id="@+id/shop_phone_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:textSize="@dimen/standard_listview_text_size" 
     android:visibility="gone"/> 
    <TextView 
     android:id="@+id/shop_notes_entry" 
     android:layout_width="@dimen/standard_dummy_size" 
     android:layout_height="match_parent" 
     android:textSize="@dimen/standard_listview_text_size" 
     android:visibility="gone"/> 
</LinearLayout> 

Beispiel 3 - Der Custom Cursor Adapter (Anmerkung getView ist nicht erforderlich, aber links in wie Sie den Code nützlich sein können - es ist die Zeilenfarben wechselt) Beachten Sie, dass NewView enthält (aufbläst) die Liste Artikel Layout

class ShopsCursorAdapter extends CursorAdapter { 
    public ShopsCursorAdapter(Context context, Cursor cursor, int flags) { 
     super(context, cursor, 0); 
    } 

    @Override 
    public View getView(int position, View convertview, ViewGroup parent) { 
     View view = super.getView(position, convertview, parent); 
     Context context = view.getContext(); 
     if (position % 2 == 0) { 
      view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorlistviewroweven)); 
     } else { 
      view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorlistviewrowodd)); 
     } 
     return view; 
    } 
    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     return LayoutInflater.from(context).inflate(R.layout.activity_shop_list_entry, parent, false); 
    } 
    @Override 
    public void bindView(View view,Context context, Cursor cursor) { 
     TextView textviewShopid = (TextView) view.findViewById(R.id.shop_id_entry); 
     TextView textViewShopName = (TextView) view.findViewById(R.id.shop_name_entry); 
     //TextView textViewShopOrder = (TextView) view.findViewById(R.id.shop_order_entry); 
     TextView textViewShopStreet = (TextView) view.findViewById(R.id.shop_street_entry); 
     TextView textViewShopCity = (TextView) view.findViewById(R.id.shop_city_entry); 
     //TextView textViewShopState = (TextView) view.findViewById(R.id.shop_state_entry); 
     //TextView textViewShopPhone = (TextView) view.findViewById(R.id.shop_phone_entry); 
     //TextView textViewShopNotes = (TextView) view.findViewById(R.id.shop_notes_entry); 

     textviewShopid.setText(cursor.getString(ShopperDBHelper.SHOPS_COLUMNN_ID_INDEX)); 
     textViewShopName.setText(cursor.getString(ShopperDBHelper.SHOPS_COLUMN_NAME_INDEX)); 
     //textViewShopOrder.setText(cursor.getString(ShopperDBHelper.SHOPS_COLUMN_ORDER_INDEX)); 
     textViewShopStreet.setText(cursor.getString(ShopperDBHelper.SHOPS_COLUMN_STREET_INDEX)); 
     textViewShopCity.setText(cursor.getString(ShopperDBHelper.SHOPS_COLUMN_CITY_INDEX)); 
     //textViewShopState.setText(cursor.getString(ShopperDBHelper.SHOPS_COLUMN_STATE_INDEX)); 
     //textViewShopPhone.setText(cursor.getString(ShopperDBHelper.SHOPS_COULMN_PHONE_INDEX)); 
     //textViewShopNotes.setText(cursor.getString(ShopperDBHelper.SHOPS_COULMN_NOTES_INDEX)); 
    } 
} 

Beispiel 4 - der onCreate Teil der Aktivität, die das Listview verwendet: -

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_shop_list_by_cursor); 

     shoplistcursor = shopperdb.getShopsAsCursor(); 
     final ListView listview = (ListView) findViewById(R.id.aslbclv01); 
     final ShopsCursorAdapter adapter = new ShopsCursorAdapter(this,shoplistcursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
     listview.setAdapter(adapter); 

Hinweis shopli stcursor wird in der Klasse definiert durch (erhöht den Umfang): -

public Cursor shoplistcursor; 

shoplistcursor = shopperdb.getShopsAsCursor(); entlang der Linien von mycursor = DatabaseHelper.fetchAllItems(); in Ihrem Fall wäre.

Das folgende ist getShopsAsCursor: -

public Cursor getShopsAsCursor() { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     String sqlstr = "SELECT * FROM " + SHOPS_TABLE_NAME + 
       " ORDER BY " + SHOPS_COLUMN_NAME + ", " + SHOPS_COLUMN_CITY + ";"; 
     return db.rawQuery(sqlstr,null); 
    } 

im Adapter (Beispiel 3), SHOPS_COLUMN _ _ ???? INDEX entspricht auf den Offset der jeweiligen Cursorspalte z.B. _id ist die erste Spalte in der Tabelle, ist es Offset , so SHOPS_COLUMN_ID_INDEX entspricht 0. Namen ist die Spalte in der Tabelle, so SHOPS_COLUMN_NAME_INDEX entspricht .


Das ist Phase 1, die es Ihnen nicht erlaubt, zu bearbeiten oder hinzuzufügen. Ich würde vorschlagen, dass die Liste zuerst funktioniert. Möglicherweise haben Sie jedoch bemerkt, dass im Layout für Beispiel 1 zwei Schaltflächen vorhanden sind, die Schaltfläche Fertig, die sich wie hinten verhält (dh der Code funktioniert nur finish()). Die zweite Schaltfläche, die Schaltfläche Hinzufügen, ermöglicht das Hinzufügen eines neuen Eintrags, indem eine andere Aktivität mit einem Layout gestartet wird, das über TextEdits für die Eingabe neuer Daten verfügt.

wie zum Editieren; existing data der code, der im beispiel 4 nicht gezeigt wird, enthält einen onItemCLicked listener und code, der es dann erlaubt, die zeilendaten zu editieren (dies verwendet tatsächlich die gleiche aktivität und das Layout, das sich entsprechend anpasst). Es enthält auch ein onItemLongClick, das die ausgewählte Zeile löschen kann.

Ich kann diese Frage geändert, wenn Sie fertig sind. Kommentieren Sie einfach, dass Sie bereit sind, @MikeT in den Kommentar einzufügen.

Verwandte Themen