【问题标题】:How to List SQlite database in a listview如何在列表视图中列出 SQlite 数据库
【发布时间】:2017-02-15 14:30:45
【问题描述】:

我已在我的应用程序中实现了此代码,以允许保存名称,然后在 ListView 中显示该名称。我想我已将名称添加到数据库中,但它显示一个空白 ListView

SQLDbHelper:

public class SqlDbHelper extends SQLiteOpenHelper
{
    public static final String DATABASE_TABLE = "PHONE_CONTACTS";


    public static final String COLUMN1 = "name";

    private static final String SCRIPT_CREATE_DATABASE = "create table "
            + DATABASE_TABLE + " (" + COLUMN1
            + " text not null);";

    public SqlDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,
                       int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(SCRIPT_CREATE_DATABASE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }

}

SqlHandler:

public class SqlHandler
{
    public static final String DATABASE_NAME = "MY_DATABASE";
    public static final int DATABASE_VERSION = 1;
    Context context;
    SQLiteDatabase sqlDatabase;
    SqlDbHelper dbHelper;

    public SqlHandler(Context context) {

        dbHelper = new SqlDbHelper(context, DATABASE_NAME, null,
                DATABASE_VERSION);
        sqlDatabase = dbHelper.getWritableDatabase();
    }

    public void executeQuery(String query) {
        try {

            if (sqlDatabase.isOpen()) {
                sqlDatabase.close();
            }

            sqlDatabase = dbHelper.getWritableDatabase();
            sqlDatabase.execSQL(query);

        } catch (Exception e) {

            System.out.println("DATABASE ERROR " + e);
        }

    }

    public Cursor selectQuery(String query) {
        Cursor c1 = null;
        try {

            if (sqlDatabase.isOpen()) {
                sqlDatabase.close();

            }
            sqlDatabase = dbHelper.getWritableDatabase();
            c1 = sqlDatabase.rawQuery(query, null);

        } catch (Exception e) {

            System.out.println("DATABASE ERROR " + e);

        }
        return c1;

    }

}

List适配器:

public class PlantListAdapter extends BaseAdapter
{

    Context context;
    ArrayList<PlantListitems> contactList;

    public PlantListAdapter(Context context, ArrayList<PlantListitems> list) {

        this.context = context;
        contactList = list;
    }

    @Override
    public int getCount() {

        return contactList.size();
    }

    @Override
    public Object getItem(int position) {

        return contactList.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        PlantListitems contactListItems = contactList.get(position);

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.plant_list_row, null);

        }

        TextView tvName = (TextView) convertView.findViewById(R.id.tv_name);
        tvName.setText(contactListItems.getName());


        return convertView;
    }

}

ListView 显示数据库的活动:

SqlHandler sqlHandler;
//private ArrayList<String> addArray;
//public static final String PREFS = "examplePrefs";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mygarden_list);
    listView = (ListView) findViewById(R.id.mygardenlist);

  sqlHandler = new SqlHandler(this);

    //addArray = new ArrayList<>();

    ArrayList<PlantListitems> contactList = new ArrayList<>();
    //contactList.clear();
    String query = "SELECT * FROM PHONE_CONTACTS ";
    Cursor c1 = sqlHandler.selectQuery(query);
    if (c1 != null && c1.getCount() != 0) {
        if (c1.moveToFirst()) {
            do {
                PlantListitems plantListItems = new PlantListitems();


                plantListItems.setName(c1.getString(c1
                        .getColumnIndex("name")));


            } while (c1.moveToNext());
        }
    }
    c1.close();

    PlantListAdapter plantListAdapter = new PlantListAdapter(mygardenMain.this, contactList);
    listView.setAdapter(plantListAdapter);

}

【问题讨论】:

  • edit 将您的代码缩减为您的问题的minimal reproducible example。您当前的代码包含许多与您的问题无关的内容 - 一个最小样本通常看起来类似于一个好的单元测试:只执行一项任务,并为可重复性指定输入值。

标签: java android sqlite listview sqliteopenhelper


【解决方案1】:

联系人列表为空。

do {
            PlantListitems plantListItems = new PlantListitems();


            plantListItems.setName(c1.getString(c1
                    .getColumnIndex("name")));

            //Add the plantListItem object to the ContactList arrayList.
            contactList.add(plantList);




        } while (c1.moveToNext());

【讨论】:

  • 这行得通,非常感谢。您知道删除数据库中的单个条目的方法吗?例如在该列表视图中显示的单个条目
  • 试试这个 DELETE FROM table_name WHERE [condition];你也可以参考这个tutorialspoint.com/sqlite/sqlite_delete_query.htm
  • 谢谢,条件可以是“名称”文本框中的当前数据吗?
  • 是的,在您的情况下,您可以使用 'DELETE FROM MY_DATABASE WHERE name = '
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
相关资源
最近更新 更多