如何在Android中使用SQLite获取和写入数据

如何在Android中使用SQLite获取和写入数据,android,sqlite,listview,Android,Sqlite,Listview,我正在尝试使用SQLite获取和设置listview的数据。我的列表必须有初始数据,用户必须能够编辑它 我创建了一个Item类 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 CO

我正在尝试使用SQLite获取和设置listview的数据。我的列表必须有初始数据,用户必须能够编辑它

我创建了一个Item类

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

然后我创建了一个DB helper类,它包含了我需要的所有方法。(请注意,这是一个混乱的类。当我努力为数据库获取数据时,我改变了很多事情。)

因此,我的应用程序将在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));
    }

}
和其他显示类别项的列表类

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

    }
}
公共类ListActivity扩展活动实现AdapterView.OnItemClickListener{
阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_列表);
ListView列表=(ListView)findViewById(R.id.ListView);
list.setOnItemClickListener(此);
DatabaseHelper dbHelper=新的DatabaseHelper(此);
createItem(新项(“a”、“a”、12));
Items item=dbHelper.getItem(-1);
//System.out.print();
add(item.getName());
list.setAdapter(适配器);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
}
}

我无法获取我插入的任何数据。当我尝试使用getItem方法时,它给了我一个错误。另外,我不知道如何将游标分离到不同的数据中,以便在getItemsTypeOf方法中获得游标后将它们解析到列表中。

您基本上需要5个组件

显示/使用包含ListView的布局的活动。 您有列表活动

包含ListView的布局。 您有活动列表(我假设您引用它)

从数据库中获取数据的一种方法。 您有fetchAllItems()。 请注意,除非您想引入复杂性,否则必须有一个名为_id的列。尽管定义了该列,fetchAllItems不会输出该列。您可以将其更改为使用*(所有列)而不是命名列,或者将\u ID包含为命名列

ListView中每一行/条目/项的布局。 你似乎没有这个。这是一个非常简单的布局

最后,您需要一个合适的适配器。游标适配器适用于游标。有一个简单的光标适配器。然而,我从来没有用过。我总是使用定制的光标适配器,这非常简单。 您似乎没有这样的适配器

我将在适当的时候添加一些示例

示例1-包含ListView的布局(我留下了一些按钮):-

示例4-使用ListView的活动的onCreate部分:-

    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);
shoplistcursor在类中定义为(增加范围):-

shoplistcursor=shopperdb.getShopsAsCursor()将与以下内容类似:
mycursor=DatabaseHelper.fetchAllItems()在您的情况下

以下是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);
    }
在适配器(示例3)中,SHOPS\u COLUMN\u INDEX等于相应光标列的偏移量,例如\u id是表中的第一列,其偏移量为0,因此SHOPS\u COLUMN\u id\u INDEX等于0name是表中的列,因此SHOPS\u column\u name\u INDEX等同于1


这是第一阶段,它不允许您编辑或添加。我建议先让清单生效。但是,您可能已经注意到,在例如1的布局中有两个按钮,一个是“完成”按钮,其作用类似于“返回”(即代码只执行finish())。第二个按钮是Add(添加)按钮,它允许通过启动另一个具有文本编辑的布局的活动来添加新条目,以输入新数据

编辑方面,;现有数据示例4中未显示的代码包括一个OnItemClick侦听器和允许编辑行数据的代码(这实际上使用了相应调整的相同活动和布局)。它还包括可以删除选定行的长单击


你准备好了,我可以修正这个问题。只需在评论中添加@MikeT即可。您实际会遇到哪些错误?
<?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>
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));
    }
}
    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);
public Cursor shoplistcursor;
    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);
    }