Как использовать ListView для просмотра базы данных SQLite в Android Studio? - PullRequest
0 голосов
/ 15 мая 2018

Моя цель - получить значения базы данных в ListView. Я никогда не использовал ListView и точно не знаю, как это сделать.

До сих пор я использовал AlertDialog для просмотра записей базы данных. Но это создает проблему: когда одна запись добавляется в базу данных и просматривается, она сохраняется в памяти стека, а когда вы добавляете другую запись в таблицу базы данных и затем просматриваете ее, она показывает новую запись, но после нажатия кнопки «Назад» она также отображает предыдущая запись как таковая.

Как мне показать записи из базы данных в ListView?

Database.java

package com.example.user.phonebook;

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

public class Database extends SQLiteOpenHelper {

    public static final String DATABASE_NAME="PhoneBook.db";
    public static final String TABLE_NAME="Information";
    public static final String ID="ID";
    public static final String NAME="Name";
    public static final String EMAIL="Email";
    public static final String PHONE="Phone";


    public Database(Context context) {
        super(context, DATABASE_NAME, null, 2);
    }



    @Override
    public void onCreate(SQLiteDatabase db) {

        String create_table= "CREATE TABLE " + TABLE_NAME + "(" + ID + " TEXT,"
                + NAME + " TEXT," + EMAIL + " TEXT," + PHONE + " TEXT" + ")";
        db.execSQL(create_table);

    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);
        onCreate(db);
    }

    public boolean AddData(String id,String name, String email, String phone)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues cv= new ContentValues();
        cv.put(ID,id);
        cv.put(NAME,name);
        cv.put(EMAIL,email);
        cv.put(PHONE,phone);

        long result=db.insert(TABLE_NAME,null,cv);

        if (result==-1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    public Cursor getData()
    {

        SQLiteDatabase db=this.getWritableDatabase();
        Cursor cv=db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
        return cv;

    }

    public boolean UpdateDate(String id, String name, String email, String phone)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put(ID,id);
        cv.put(NAME,name);
        cv.put(EMAIL,email);
        cv.put(PHONE,phone);
        db.update(TABLE_NAME,cv,"ID="+id,null);
        return true;

    }
    }

MainActivity.java

package com.example.user.phonebook;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    EditText ed1,ed2,ed3,ed4;
    TextView tv;
    Button bn1,bn2,bn3;
    Database mydb;
    ListView lv;



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

        ed1=(EditText)findViewById(R.id.editText);
        ed2=(EditText)findViewById(R.id.editText2);
        ed3=(EditText)findViewById(R.id.editText4);
        ed4=(EditText)findViewById(R.id.editText3);
        tv=(TextView) findViewById(R.id.textView2);
        bn1=(Button) findViewById(R.id.button);
        bn2=(Button) findViewById(R.id.button2);
        bn3=(Button) findViewById(R.id.button3);
        lv=(ListView)findViewById(R.id.listview) ;


        mydb=new Database(this);

        bn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean value=mydb.AddData(ed4.getText().toString(),ed1.getText().toString(),ed2.getText().toString(),ed3.getText().toString());

                if (value==true)
                {
                    Toast.makeText(getApplicationContext(),"Data Inserted",Toast.LENGTH_SHORT).show();
                }
                else
                {
                    Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show();
                }
            }
        });


        bn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Cursor cv=mydb.getData();
                if (cv.getCount()==0)
                {
                    Toast.makeText(getApplicationContext(),"No data found",Toast.LENGTH_SHORT).show();
                    return;
                }

                while (cv.moveToNext())
                {
                    StringBuffer stringBuffer=new StringBuffer();


                    stringBuffer.append("ID : "+cv.getString(0)+"\n");
                    stringBuffer.append("Name : "+cv.getString(1)+"\n");
                    stringBuffer.append("Email ID : "+cv.getString(2)+"\n");
                    stringBuffer.append("Phone No. : "+cv.getString(3)+"\n\n");


                    message("Details", stringBuffer.toString());
                }



            }
        });


        bn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                boolean isupdated=mydb.UpdateDate(ed4.getText().toString(),ed1.getText().toString(),ed2.getText().toString(),ed3.getText().toString());
                if (isupdated==true)
                {
                    Toast.makeText(getApplicationContext(),"Data Updated",Toast.LENGTH_SHORT).show();
                }
                else
                {
                    Toast.makeText(getApplicationContext(),"Updation failed",Toast.LENGTH_SHORT).show();
                }

            }
        });





    }

    public void message(String title, String messageis)
    {
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setCancelable(true);
        builder.setTitle(title);
        builder.setMessage(messageis);
        AlertDialog dialog=builder.create();
        dialog.show();
    }




}

XML-формат:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="Name"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/editText2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:ems="10"
        android:hint="Email ID"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/editText4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/editText4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="76dp"
        android:ems="10"
        android:hint="Phone Number"
        android:inputType="phone"
        app:layout_constraintBottom_toTopOf="@+id/button2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Save"
        app:layout_constraintEnd_toStartOf="@+id/button2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/button2" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="256dp"
        android:text="View"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Update"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/button2"
        app:layout_constraintTop_toTopOf="@+id/button2" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="ID"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/button2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText4"
        app:layout_constraintVertical_bias="0.076" />

    <ListView
        android:id="@+id/listview"
        android:layout_width="347dp"
        android:layout_height="185dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:divider="#f00"
        android:dividerHeight="1sp"
        android:listSelector="#faa"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.846"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button2"
        app:layout_constraintVertical_bias="0.028" />

</android.support.constraint.ConstraintLayout>

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Создать модельный класс с тремя параметрами

идентификатор строки, имя строки, адрес электронной почты строки, телефон строки

В вашем коде в классе Database.java создайте метод "getData", который будет возвращать список таблиц: TABLE_NAME Как это

public List<ModelName modelname> getData()
    {
        SQLiteDatabase db=this.getReadableDatabase();
        List<ModelName > modelList=new ArrayList<>();
        Cursor res=db.rawQuery("SELECT * FROM "+TABLE_NAME,null);
        if(res!=null && res.moveToFirst())
        {
            do {

                ModelName model=new ModelName ();

                model.setId(res.getInt(res.getColumnIndex(ID)));
                model.setName(res.getString(res.getColumnIndex(NAME)));
                model.setEmail(res.getDouble(res.getColumnIndex(EMAIL)));
                model.setPhone(res.getString(res.getColumnIndex(PHONE)));

            }while (res.moveToNext());
        }
        res.close();
        db.close();
        return modelList;
    } // end of getdata method

Этот метод вернет список данных, которые будут необходимы для заполнения в коде списка, например:

Это вернет список

Список listName = db.getData;

Добавить этот список в коде списка

// Find ListView to populate
ListView lvItems = (ListView) findViewById(R.id.lvItems);
// Setup cursor adapter using cursor from last step
YourAdapter adapter = new YourAdapter(this, listName);
// Attach cursor adapter to the ListView 
lvItems.setAdapter(todoAdapter);

Удачи

0 голосов
/ 15 мая 2018

Вы CursorAdapter, CursorAdapter вписывается между Cursor (источник данных из запроса SQLite) и ListView (визуальное представление) и настраивает два аспекта:

Какой шаблон макета нужно накачать для элемента Какие поля полякурсор для привязки, к которому представления в шаблоне

просто создают шаблон макета XML в файле res / layout / item_todo.xml, представляющий конкретную строку курсора:

   <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <TextView
        android:id="@+id/tvBody"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Study cursors"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <TextView
        android:id="@+id/tvPriority"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="3"
        android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>

Далее нам нужноопределить адаптер, чтобы описать процесс проецирования данных курсора в представление.Для этого нам нужно переопределить метод newView и метод bindView.Наивный подход к этому (без кэширования любого вида) выглядит следующим образом:

public class TodoCursorAdapter extends CursorAdapter {
  public TodoCursorAdapter(Context context, Cursor cursor) {
      super(context, cursor, 0);
  }

  // The newView method is used to inflate a new view and return it, 
  // you don't bind any data to the view at this point. 
  @Override
  public View newView(Context context, Cursor cursor, ViewGroup parent) {
      return LayoutInflater.from(context).inflate(R.layout.item_todo, parent, false);
  }

  // The bindView method is used to bind all data to a given view
  // such as setting the text on a TextView. 
  @Override
  public void bindView(View view, Context context, Cursor cursor) {
      // Find fields to populate in inflated template
      TextView tvBody = (TextView) view.findViewById(R.id.tvBody);
      TextView tvPriority = (TextView) view.findViewById(R.id.tvPriority);
      // Extract properties from cursor
      String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
      int priority = cursor.getInt(cursor.getColumnIndexOrThrow("priority"));
      // Populate fields with extracted properties
      tvBody.setText(body);
      tvPriority.setText(String.valueOf(priority));
  }
}

Сначала мы определяем конструктор, который передает курсор и контекст суперклассу.Далее мы переопределяем метод newView, который используется для раздувания нового шаблона представления.Наконец, мы переопределяем метод bindView, который используется для привязки всех данных к данному представлению, чтобы заполнить содержимое шаблона для элемента.

Получение курсора Чтобы использовать CursorAdapter, нам нужно запросить SQLiteбазы данных и вернуть курсор, представляющий набор результатов.Это требует, чтобы мы использовали SQLiteOpenHelper для сохранения, как описано здесь, или ORM, который обеспечивает доступ к базовой базе данных.

Как только у вас есть база данных и определены таблицы, тогда мы можем получить доступ к Cursor, выполнив запрос к базе данныхс помощью rawQuery:

// TodoDatabaseHandler is a SQLiteOpenHelper class connecting to SQLite
TodoDatabaseHandler handler = new TodoDatabaseHandler(this);
// Get access to the underlying writeable database
SQLiteDatabase db = handler.getWritableDatabase();
// Query for items from the database and get a cursor back
Cursor todoCursor = db.rawQuery("SELECT  * FROM todo_items", null);

Теперь мы можем использовать CursorAdapter в Activity для отображения массива элементов в ListView:

// Find ListView to populate
ListView lvItems = (ListView) findViewById(R.id.lvItems);
// Setup cursor adapter using cursor from last step
TodoCursorAdapter todoAdapter = new TodoCursorAdapter(this, todoCursor);
// Attach cursor adapter to the ListView 
lvItems.setAdapter(todoAdapter);

Это затем вызовет CursorAdapter, выполняющий итерацию понабор результатов и заполнение списка.Мы можем изменить курсор для обновления адаптера в любое время:

// Switch to new cursor and update contents of ListView
todoAdapter.changeCursor(todoCursor);

Ссылочная ссылка

...