2016-12-02 3 views
1

I Sqlite Datenbank verwenden zusammen mit Recyclerview und Cardview die Daten in Recyclerview .My zu zeigen Recyclerview ist, um die Daten, die zeigen, aber es zeigt es nicht in einer Sequenz, ist es nicht normal verhalten, i 6 Artikel hinzugefügt haben, aber 18 Artikel mit den wiederholten Namen und mit viel Raum nach jeder item.what zeigt die issue.Here ist mein Code ..RecyclervIew zeigt nicht SQLite-Datenbank Daten richtig

databasehelper.java

public class databasehandler extends SQLiteOpenHelper { 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "Foodmanager"; 

    // Food table name 
    private static final String TABLE_FOOD = "Food"; 
    private static databasehandler dbhelper; 

    // Food Table Columns names 
    private static final String KEY_ID= "id"; 
    private static final String FOOD_CATEGORY = "Food_category"; 
    private static final String FOOD_ITEM = "Food_item"; 
    private static final String PROTEINS = "Proteins"; 
    private static final String FAT = "Fat"; 
    private static final String CARB = "carb"; 
    private static final String CALORIES = "calories"; 

    public static synchronized databasehandler getInstance(Context context) { 
     // Use the application context, which will ensure that you 
     // don't accidentally leak an Activity's context. 

     if (dbhelper == null) { 
      dbhelper = new databasehandler(context.getApplicationContext()); 
     } 
     return dbhelper; 
    } 


    public databasehandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     SQLiteDatabase db=this.getWritableDatabase(); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_FOOD_TABLE = "CREATE TABLE " + TABLE_FOOD +" (id INTEGER PRIMARY KEY,Food_category TEXT,Food_item TEXT,Proteins REAL,Fat REAL,carb REAL,calories REAL)"; 
     db.execSQL(CREATE_FOOD_TABLE); 

    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_FOOD); 

     // Create tables again 
     onCreate(db); 
    } 

    /**, 
    * All CRUD(Create, Read, Update, Delete) Operations 
    */ 

    // Adding new contact 
    public void addfood(food_items food_item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(FOOD_CATEGORY, food_item.getfood_category()); 
     values.put(FOOD_ITEM, food_item.getfood_item()); 
     values.put(PROTEINS, food_item.getproteins()); 
     values.put(FAT, food_item.getfat()); 
     values.put(CARB, food_item.getcarb()); 
     values.put(CALORIES, food_item.getcalorie()); 

     db.insert(TABLE_FOOD, null, values); 
     db.close(); // Closing database connection 
    } 

    // Getting single food item 
    public food_items getfood_item(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_FOOD, new String[] { FOOD_CATEGORY, 
         FOOD_ITEM, PROTEINS,FAT,CARB,CALORIES }, FOOD_CATEGORY + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     assert cursor != null; 
     food_items food_item = new food_items(cursor.getString(0), 
       cursor.getString(1), Float.parseFloat(cursor.getString(2)),Float.parseFloat(cursor.getString(3)), 
       Float.parseFloat(cursor.getString(4)),Float.parseFloat(cursor.getString(5))); 
     // return contact 
     return food_item; 
    } 
    public String getfood_category(){ 
     String food_category=""; 
     String selectQuery="SELECT FOOD_CATEGORY FROM " + TABLE_FOOD; 
     SQLiteDatabase db=this.getReadableDatabase(); 
     Cursor cursor=db.rawQuery(selectQuery,null); 
     if(cursor.moveToFirst()){ 
      do{ 
       food_category=cursor.getString(0); 
      } 
      while (cursor.moveToNext()); 
     } 
     return food_category; 
    } 


     public List<food_items> getAllfood_items() { 
     List<food_items> food_item_list = new ArrayList<>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_FOOD; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       food_items food_item = new food_items(); 
//    food_item.setId(Integer.parseInt(cursor.getString(0))); 
       food_item.setfood_category(cursor.getString(0)); 
       food_item.setfood_item(cursor.getString(1)); 
       food_item.setproteins(Float.parseFloat(cursor.getString(2))); 
       food_item.setfat(Float.parseFloat(cursor.getString(3))); 
       food_item.setcarb(Float.parseFloat(cursor.getString(4))); 
       food_item.setcalorie(Float.parseFloat(cursor.getString(5))); 

       food_item_list.add(food_item); 
      } while (cursor.moveToNext()); 
     } 

     return food_item_list; 
    } 

    // Updating single contact 
    public int updatefood(food_items food_item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(FOOD_CATEGORY, food_item.getfood_category()); 
     values.put(FOOD_ITEM, food_item.getfood_item()); 
     values.put(PROTEINS, food_item.getproteins()); 
     values.put(FAT, food_item.getfat()); 
     values.put(CARB, food_item.getcarb()); 
     values.put(CALORIES, food_item.getcalorie()); 

     // updating row 
     return db.update(TABLE_FOOD, values, FOOD_CATEGORY + " = ?", 
       new String[] { food_item.getfood_category() }); 
    } 

    // Deleting single contact 
    public void deletefood(food_items food_item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_FOOD, FOOD_CATEGORY + " = ?", 
       new String[] { food_item.getfood_category() }); 
     db.close(); 
    } 


    // Getting contacts Count 
    public int getfoodCount() { 
     String countQuery = "SELECT * FROM " + TABLE_FOOD; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     cursor.close(); 

     // return count 
     return cursor.getCount(); 
    } 

} 

foodactivity.java

public class food_activity extends com.samarth.lightweight.base_Activity { 

    private RecyclerView recyclerView; 
    private food_category_adapter adapter; 
    databasehandler db; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     getLayoutInflater().inflate(R.layout.food_category, frameLayout); 

     db=databasehandler.getInstance(getApplicationContext()); 

     preparedata(); 

     recyclerView=(RecyclerView)findViewById(R.id.recycler_view1); 

     setTitle("Calories in food"); 

     adapter=new food_category_adapter(this,db.getAllfood_items()); 


     recyclerView.setHasFixedSize(true); 
     recyclerView.setAdapter(adapter); 
//  RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 


    } 

    public void preparedata() { 

      db.addfood(new food_items("Dairy and Egg Products","Milk",0f,0f,0f,0f)); 
      db.addfood(new food_items("Spices and Herbs","Milk",0f,0f,0f,0f)); 
      db.addfood(new food_items("Fats and Oils","Milk",0f,0f,0f,0f)); 
      db.addfood(new food_items("Soups, Sauces, and Gravies","Milk",0f,0f,0f,0f)); 
      db.addfood(new food_items("Fruits","Milk",0f,0f,0f,0f)); 
      db.addfood(new food_items("Vegetables","Milk",0f,0f,0f,0f)); 

    } 

} 

food_Category_adapter

 public class food_category_adapter extends 
      RecyclerView.Adapter<com.samarth.lightweight.database.food_category_adapter.ViewHolder> 
    { 
     private static final int TYPE_HEAD=0; 
     private static final int TYPE_LIST=1; 
     public String category; 


     private Context mContext; 
     private List<food_items> food_items; 

     public food_category_adapter(Context context,List<food_items> food_itemses) { 
      mContext=context; 
      food_items=food_itemses; 
     } 


     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 


      if(viewType==TYPE_LIST) { 
       View itemView = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.card, parent, false); 

       return new ViewHolder(itemView,viewType); 
      } 
      else if(viewType==TYPE_HEAD) 
      { 
       View itemView = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.header_recycle_view, parent, false); 

       return new ViewHolder(itemView,viewType); 
      } 
      return null; 
     } 


     public class ViewHolder extends RecyclerView.ViewHolder 
     { 
      int view_type; 
      public TextView food_category; 
      public ImageView food_image; 
      public ImageView header_image; 


      public ViewHolder(View view,int viewType) { 
       super(view); 

       if(viewType==TYPE_LIST) { 
        food_category = (TextView) view.findViewById(R.id.food_category); 
        food_image=(ImageView)view.findViewById(R.id.image); 
        view_type=1; 

        view.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          category=food_category.getText().toString(); 
          Intent intent = new Inten 

t(v.getContext(),food_item_description.class); 
         intent.putExtra("category_food",category); 
         v.getContext().startActivity(intent); 
        } 
       }) ; 

      } 
      else if(viewType==TYPE_HEAD) 
      { 
       header_image=(ImageView) view.findViewById(R.id.food_main); 
       view_type=0; 
      } 
     } 
    } 





    @Override 
    public void onBindViewHolder(com.samarth.lightweight.database.food_category_adapter.ViewHolder viewHolder, int position) 
    { 
     if(viewHolder.view_type==TYPE_LIST){ 
      com.samarth.lightweight.database.food_items food_item=food_items.get(position-1); 
      viewHolder.food_category.setText(food_item.getfood_category()); 
     } 
     else if(viewHolder.view_type==TYPE_HEAD) 
     { 
      viewHolder.header_image.setImageResource(R.drawable.food_category1); 
     } 

    } 

    @Override 
    public int getItemCount() { 

     if(food_items!=null) 
     return food_items.size()+1; 
     return 0; 
    } 
    @Override 
    public int getItemViewType(int position) 
    { 
     if(position==0) 
      return TYPE_HEAD; 
     return TYPE_LIST; 

    } 
} 

Antwort

3

Weil jedes Mal, wenn Ihr Start der App preparedata ausgeführt werden und dieselben Daten werden in die Datenbasis und später von Recyclerview angezeigt wird eingefügt werden.

wenn Sie nur einmal Ihre Daten einfügen wollen, dann sollten Sie diese onCreate Ihrer databasehandler

@Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_FOOD_TABLE = "CREATE TABLE " + TABLE_FOOD +" (id INTEGER PRIMARY KEY,Food_category TEXT,Food_item TEXT,Proteins REAL,Fat REAL,carb REAL,calories REAL)"; 
     db.execSQL(CREATE_FOOD_TABLE); 
     // execute your insert commands here to insert data only once 
     addfood(new food_items("Dairy and Egg Products","Milk",0f,0f,0f,0f),db); 
     addfood(new food_items("Spices and Herbs","Milk",0f,0f,0f,0f),db); 
     addfood(new food_items("Fats and Oils","Milk",0f,0f,0f,0f),db); 
     addfood(new food_items("Soups, Sauces, and Gravies","Milk",0f,0f,0f,0f),db); 
     addfood(new food_items("Fruits","Milk",0f,0f,0f,0f),db); 
     addfood(new food_items("Vegetables","Milk",0f,0f,0f,0f),db); 
     db.close(); // Closing database connection 
    } 

und im Gebrauch innerhalb tun addfood als überladene Methode bedeuten, jetzt wird es zwei addfood Funktionen sein und dieser wird erhalten db als zweiter Parameter

public void addfood(food_items food_item, SQLiteDatabase db) { 
     ContentValues values = new ContentValues(); 
     values.put(FOOD_CATEGORY, food_item.getfood_category()); 
     values.put(FOOD_ITEM, food_item.getfood_item()); 
     values.put(PROTEINS, food_item.getproteins()); 
     values.put(FAT, food_item.getfat()); 
     values.put(CARB, food_item.getcarb()); 
     values.put(CALORIES, food_item.getcalorie()); 

     db.insert(TABLE_FOOD, null, values); 
    } 

Hinweis: nach der Änderung müssen Sie Ihre App deinstallieren alte sqlite Daten zu löschen und dann führe den modifizierten Code aus

+0

Sir, wenn ich mehr Elemente in meiner Datenbank hinzufügen will, muss ich jedes Mal ein neues ContentValues-Objekt erstellen oder gibt es dafür eine andere Lösung? –

+0

@samarthkejriwal versuchen, aktualisierte Antwort, können Sie erstellen "Werte" als globale Variable und initialisieren sie in 'oncreate' bedeuten" ContentValues ​​Werte "auf Klassenebene wie' CALORIES' deklarieren und 'values ​​= new ContentValues ​​();' innerhalb 'oncreate ', aber 'statische' bedeuten Daten von' Werten' werden nicht weggehen, so alte Werte werden da sein, wenn Sie später 'Werte' verwenden wollen Objekt –

+1

Vielen Dank sir.It löste mein Problem. !! :) –

Verwandte Themen