Search code examples
androidlistviewandroid-sqliteandroid-fragmentactivity

Displaying data from sqlite database into listview in fragment activity


As a newcomer to android development I've been stuck on this issue for a few weeks now and it's getting pretty tiring.

After looking at every tutorial and reading every question and answer I could find, still I can't figure out how to get Android Studio to just take what's in my SQLite database and paste its contents into a listview. I want to display ALL data from my database (All_wine.db) into my listview (listwine).My app is bulid normally with android studio, but the app crashed and unfortunately Myapplication has stopped in nox.

Here is my code:

DatabaseHelper.java

    package com.example.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "All_wine.db";
    private static final String DB_TABLE = "All_wine_Table";

    //columns
    private static final String  ID = "ID";
    private static final String NAME ="NAME";

    private static final String CREATE_TABLE ="CREATE TABLE "+DB_TABLE+"  ("+
           ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
        NAME+ " TEXT "+ ")";

    public DatabaseHelper(Context context) {
        super(context,DB_NAME ,null,1);

    }

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factoty, int version) {
        super(context,DB_NAME ,null,1);

    }

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factoty, int version, DatabaseErrorHandler errorHandler) {
        super(context,DB_NAME ,null,1);

    }



    @Override
    public void onCreate(SQLiteDatabase db) {


        db.execSQL("CREATE TABLE IF NOT EXISTS " +DB_TABLE + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT)");
        db.execSQL("INSERT INTO " +DB_TABLE  + "(NAME) VALUES ('Mοσχατο ελληνικο ')");
        db.execSQL("INSERT INTO " +DB_TABLE  + "(NAME) VALUES ('Vin Dux')");



    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i ,int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+ DB_TABLE);


        onCreate(sqLiteDatabase);

    }


    public void insertinallwine(String namewine){

        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();

        contentValues.put(NAME,namewine);
        sqLiteDatabase.insert(DB_TABLE,null,contentValues);

    }




    //create method  to view data
   public Cursor viewData(){

        SQLiteDatabase db = this.getReadableDatabase();
        String query = "Select * from " + DB_TABLE;
        Cursor cursor = db.rawQuery(query, null);
        return cursor;
    }


}

Home_Fragment.java

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;

import static com.facebook.FacebookSdk.getApplicationContext;

public class Home_Fragment extends Fragment {

    DatabaseHelper db ;
    ArrayList<String> listItem;
    ArrayAdapter adapter;
    ListView listwine;




    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_home, container, false);

     //  db = new DatabaseHelper(getActivity(),"All_wine.db",null,1);
        db = new DatabaseHelper(getContext());
      listItem=new ArrayList<>();

        listwine=(ListView)getActivity().findViewById(R.id.wine_list);

        db.insertinallwine("Samos Grand Cru");

        viewData();

        return  view;
    }

    private void viewData(){

        Cursor cursor=db.viewData();
        if(cursor.getCount() == 0)    {

            Toast.makeText(getContext(),"No data to show",Toast.LENGTH_LONG).show();

        }else{

            while (cursor.moveToNext()){
                listItem.add(cursor.getString(1));     //index 1 is name index 0 is id
            }
        }


        adapter = new ArrayAdapter(getContext(),android.R.layout.simple_list_item_1,listItem);
        listwine.setAdapter(adapter);


    }



}

fragment_home.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/eoss_samou">




    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/wine_list"
        tools:ignore="InvalidId"/>


</RelativeLayout>

I'm sure there is something really dumb I'm missing but any help would be appreciated.


Solution

  • I noticed something odd in your code. this could be the issue.


    Your wine_list(ListView) is in your fragment but you are trying to access it from your activity.

    Try replacing

    listwine=(ListView)getActivity().findViewById(R.id.wine_list);
    

    with

    listwine=(ListView)view.findViewById(R.id.wine_list);