无法从sqlite db

时间:2018-06-20 07:29:35

标签: java android sqlite

我创建了一种从数据库中检索所有收藏夹的方法,但是没有获取任何数据。

我添加了一个Log.e来检查数据计数,其数据如下:

I/SQLiteAssetHelper: successfully opened database FoodDB.db
fav: []: : is count

所以请告知我错误的确切位置,以及如何从活动中调用该方法以获取所有数据。

getAllFavorites方法

public List<Favorites> getAllFavorites (String foodId) {
        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

        String[] sqlSelect = {"FoodId", "Name", "Image", "Description", "Components",
                "MenuId", "UserName"};
        String sqlTable = "Favorites";

        qb.setTables(sqlTable);

        Cursor c = qb.query(db, sqlSelect, "FoodId=?", new String[]{foodId}, null, null, null);

        final List<Favorites> result = new ArrayList<>();
        if (c.moveToFirst()) {
            do {
                result.add(new Favorites(
                        c.getString(c.getColumnIndex("FoodId")),
                        c.getString(c.getColumnIndex("Name")),
                        c.getString(c.getColumnIndex("Image")),
                        c.getString(c.getColumnIndex("Description")),
                        c.getString(c.getColumnIndex("Components")),
                        c.getString(c.getColumnIndex("MenuId")),
                        c.getString(c.getColumnIndex("UserName"))
                ));
            } while (c.moveToNext());

        }
        db.close();
        return result;
    }

activity_favorites.JAVA

public class FavoritesActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    FavoritesAdapter adapter;

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

        recyclerView = findViewById(R.id.recycler_favorites);
        recyclerView.setHasFixedSize(true);

        LinearLayoutManager myLayoutManager = new LinearLayoutManager(this);
        myLayoutManager.setReverseLayout(true);
        myLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(myLayoutManager);

        loadFavorites();
    }

    private void loadFavorites() {




        adapter = new FavoritesAdapter(this, new Database(this).getAllFavorites("FoodId"));


        adapter.notifyDataSetChanged();

        recyclerView.setAdapter(adapter);
        Toast.makeText(getApplicationContext(), "check is it working?", Toast.LENGTH_SHORT).show();
        Log.e("fav: "+new Database(this).getAllFavorites("FoodId"), ": is count");

    }

}

3 个答案:

答案 0 :(得分:1)

考虑到调试确认您已经在数据库中存在数据并且可以访问它,并且看来您正在按照正确的步骤使用RecyclerView,那么问题很可能出在收藏夹适配器上。

>

作为显示此内容的一种快速方法,以下步骤和代码应显示一个列表,但使用ArrayAdapter以及ListView和股票布局。

  1. 将ListView添加到您的layout.activity_favorites.xml中,并为其指定 listview 的ID(确保它是可见的)。

  2. 添加4行作为类变量(即在FavoritesAdapter之后):-

    ListView mListView; 列出mFavoritesList; ArrayAdapter mAdapter; 数据库mDBHlpr;

  3. 根据添加在1(在setContentView(R.layout.activity_favorites);之后)的列表视图的ID,添加以下行来设置mListView:-

    mListView = this.findViewById(R.id.listview);
    mDBHlpr = new Database(this);
    mFavoritesList = mDBHlpr.getAllFavorites("doesn't matter as not used as yet");
    mAdapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,mFavoritesList);
    mListView.setAdapter(mAdapter);
    
    • 请注意,这假设getAllFavorites使用Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);

4运行该应用程序,希望您能从:-

enter image description here

  • 注意mjt.usingrecyclerviews.Favorites是程序包/类的名称。也就是说,它列出了BUT行,因为ArrayAdapter的默认值是使用toString方法,并且在收藏夹类中都没有定义它使用默认值。因此,包装类,然后是各个对象的标识符。

  • 此屏幕截图是在两次运行代码/应用程序之后,每次都向Favoorites表中添加3行,从而在ListView中添加了6行。

将以下方法添加到“收藏夹”类中:-

public String toString() {
    return "Id=" + String.valueOf(this.foodid) + " Name=" + this.name + " etc.....";
}

结果:-

enter image description here

  • 因此,现在是第3次跑步,而这3个人中有3套(预期)

下一步做什么。

如前所述,适配器很可能出现此问题。因此,我建议将此标记为已回答(即,您现在可以从数据库中检索数据,或者至少知道它在那里),然后询问另一个问题,这一次为适配器提供了代码。

答案 1 :(得分:0)

下载“ sqlite expert personal”并将您的db文件复制到“ sqlite expert personal”。您可以在其中查看表和值,还可以写下与在应用程序中编写的查询相同的查询,并确定其是否正常运行。

答案 2 :(得分:-1)

尝试这种方式..

   public List<Comment> getComments(int itemId) {
    List<Comment> commentList = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT  * FROM " + COMMENTS_TABLE_NAME + " WHERE item_id=" + itemId;
    Cursor c = db.rawQuery(selectQuery, null);
    if (c != null) {
        c.moveToFirst();
        while (c.isAfterLast() == false) {
            Comment comment = new Comment();
            comment.id = (c.getInt(c.getColumnIndex("id")));
            comment.comment = (c.getString(c.getColumnIndex("comment")));
            commentList.add(comment);
            c.moveToNext();
        }
    }
    c.close();
    db.close();
    return commentList;
}