数据库不能正确显示数据
我有一个问题,即,我有一个应用程序显示在RecyclerView 2类型的沙拉,并按后,其中一个应该显示一个视图显示其确切的细节,我们不喜欢它。这些数据显然是从数据库中检索的。而且一切都有效,直到我们进入详细视图 - 当我们点击希腊沙拉的图片时,我们看到一片空白的景色,但是当点击鸡肉沙拉时,我们只能看到希腊沙拉的景色,有趣的是什么?那么鸡肉沙拉的视角在哪里?为什么这些观点变成了地方。我将底部的代码附在图片上,以便您可以准确理解问题所在。数据库不能正确显示数据
DatabaseHelper
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "app";
private static final int DB_VERSION = 1;
public MiodzioDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE SALAD (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "IMAGE_RESOURCE_ID INTEGER, "
+ "FAVORITE INTEGER);");
insertSalatki(db, "Greek salad", R.drawable.salad_greek, 0);
insertSalatki(db, "Chicken salad", R.drawable.salad_chicken, 0);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
private static void insertSalatki(SQLiteDatabase db, String name, int resourceId, int favorite){
ContentValues saladValues = new ContentValues();
salatkiValues.put("NAME", name);
salatkiValues.put("IMAGE_RESOURCE_ID", resourceId);
salatkiValues.put("Favorite", favorite);
db.insert("SALAD", null, salatkiValues);
}
}
沙拉
public class Salad {
private String name;
private int imageResourceId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImageResourceId() {
return imageResourceId;
}
public void setImageResourceId(int imageResourceId) {
this.imageResourceId = imageResourceId;
}
}
SaladDe tailActivity
public class SaladDetailActivity extends AppCompatActivity {
public static final String EXTRA_SALAD = "salad";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_salatki_detail);
int salads = (Integer) getIntent().getExtras().get(EXTRA_SALAD);
try {
SQLiteOpenHelper miodzioDatabaseHelper = new MiodzioDatabaseHelper(this);
SQLiteDatabase db = miodzioDatabaseHelper.getWritableDatabase();
Cursor cursor = db.query("SALATKI",
new String[]{"NAME", "IMAGE_RESOURCE_ID", "FAVORITE"},
"_id = ?",
new String[]{Integer.toString(salads)},
null, null, null);
if(cursor != null) {
if (cursor.moveToFirst()) {
do {
String nameText = cursor.getString(0);
int photoId = cursor.getInt(1);
boolean isFavorite = (cursor.getInt(2) == 1);
TextView name = (TextView) findViewById(R.id.salad_text);
name.setText(nameText);
ImageView photo = (ImageView) findViewById(R.id.salad_image);
photo.setImageResource(photoId);
photo.setContentDescription(nameText);
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
favorite.setChecked(isFavorite);
}while (cursor.moveToNext());
}
}
cursor.close();
db.close();
}catch (SQLiteException e){
Toast.makeText(this, "Database does not work!", Toast.LENGTH_SHORT).show();
}
Toolbar myChildToolbar = (Toolbar) findViewById(R.id.my_child_toolbar_salad_detail);
setSupportActionBar(myChildToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_create_order:
Intent intent = new Intent(this, AddActivity.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void onFavoriteClicked(View view) {
int salads = (Integer) getIntent().getExtras().get(EXTRA_SALAD);
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
ContentValues saladValues = new ContentValues();
saladValues.put("FAVORITE", favorite.isChecked());
SQLiteOpenHelper databaseHelper = new DatabaseHelper(this);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.update("SALAD", saladValues,
"_id = ?", new String[]{Integer.toString(salads)});
db.close();
}
}
SaladMaterialFragment
public class SaladMaterialFragment extends Fragment {
private DatabaseHelper dataBaseHelper;
private Cursor cursor;
private ArrayList<Salad> arrayList = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
RecyclerView saladRecyler = (RecyclerView) inflater.inflate(R.layout.fragment_salad_material, container, false);
try{
SQLiteOpenHelper databaseHelper = new databaseHelper(inflater.getContext());
SQLiteDatabase db = databaseHelper.getReadableDatabase();
cursor = db.query("SALAD",
new String[] {"NAME", "IMAGE_RESOURCE_ID"},
null, null, null, null, null);
if(cursor != null){
if(cursor.moveToFirst()){
do{
Salad salads = new Salad();
salad.setName(cursor.getString(0));
salad.setImageResourceId(cursor.getInt(1));
arrayList.add(salad);
}while (cursor.moveToNext());
}
}
}catch (SQLiteException e){
Toast.makeText(inflater.getContext(), "Database does not work!", Toast.LENGTH_SHORT).show();
}
CaptionedImagesAdapter adapter = new CaptionedImagesAdapter(getActivity(), arrayList);
saladRecyler.setAdapter(adapter);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
saladRecyler.setLayoutManager(gridLayoutManager);
adapter.setListener(new CaptionedImagesAdapter.Listener() {
@Override
public void onClick(int position) {
Intent intent = new Intent(getActivity(), SaladDetailActivity.class);
intent.putExtra(SaladDetailActivity.EXTRA_SALAD, position);
getActivity().startActivity(intent);
}
});
return salatkaRecyler;
}
}
SaladDetailLayout
<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="match_parent"
android:orientation="vertical"
tools:context="com.hfad.SaladDetailActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/my_child_toolbar_salad_detail"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@android:color/holo_green_light"
android:elevation="4dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
/>
<TextView
android:id="@+id/salatki_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<ImageView
android:id="@+id/salad_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>
<CheckBox
android:id="@+id/favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/favorite"
android:onClick="onFavoriteClicked"/>
所以,当我点击希腊沙拉,我得到一个空的观点仅与它是否是一个最喜欢的选项。当我点击鸡肉沙拉时,我会看到希腊沙拉。我不知道发生了什么事?
问题是在SaladMaterialFragment类的onClick方法。 您正在传递该项目的位置,并在ArrayList索引以0开头。 但是在数据库插入中,_id INTEGER PRIMARY KEY AUTOINCREMENT,数据库索引将以1开头。
所以你需要改变下面的onClick方法。
adapter.setListener(new CaptionedImagesAdapter.Listener() {
@Override
public void onClick(int position) {
Intent intent = new Intent(getActivity(), SaladDetailActivity.class);
intent.putExtra(SaladDetailActivity.EXTRA_SALAD, position+1);
getActivity().startActivity(intent);
}
});
只要改变位置与位置+ 1。
谢谢你的男人!这正是我所期待的!一切正常,因为它应该:) – newActivity21
而且您要插入的int
值的drawable
资源这是不是一个好主意。该值在您的应用程序的整个生命周期中不一定是恒定的 - 稍后的版本可能会为此资源发出新的值。 所以请不要这样做。
insertSalatki(db, "Greek salad", R.drawable.salad_greek, 0);
取而代之的是将drawable
映射为一个独立但不变的参考。有些事是这样的:
insertSalatki(db, "Greek salad", idSaladGreek, 0);
所以,因为你的数据库中可能有很多行与沙拉类型相同(例如,希腊沙拉)与潜在的许多不同的资源ID,当你查询你的数据库沙拉类型你可能会得到错误的资源ID。这可能会导致您无法显示图像的问题。
通过比较来自数据库的int
值(int photoId = cursor.getInt(1)
)和int
值R.drawable.salad_greek
进行测试。
在你SaladDetailActivity
你也应该检查,看看是否要为得到一个有效值:
int salads = (Integer) getIntent().getExtras().get(EXTRA_SALAD);
“在你的DatabaseHelper类中,每当你调用这个类的时候,你看起来就像插入一个新行一样?我没有看到这个表的UNIQUE约束,如果这样你会增加你的应用程序存储空间,并为你的数据库填充无用的数据以及可能无效的数据。“所以我必须做什么? 我只是在学习数据库,不完全是它的全部内容。 – newActivity21
感谢您将int更改为drawable的建议,我已经做到了。“通过比较来自数据库的int值(int photoId = cursor.getInt(1))和R.drawable.salad_greek的int值“。 - 所以我的int photoId叫我沙拉希腊,那么沙拉鸡在哪里?我不知道问题出在哪里。 – newActivity21
我没有看到您的recyclerview或适配器。你确定你在使用它们吗? – msecilmis
为我自己说话,但我不认为我们需要截图。我希望看到Layout xml内容。 – Barns
@msecilmis 你是对的,我的错误两次,我复制了SaladDetailActivity代码,我已经修复了,还应该有一个SaladFragment类,它是RecyclerView。我添加了一个RecyclerAdapter类,其中有一个接口侦听器。 – newActivity21