آموزش دیتابیس Sqlite و نمایش آن در ListView

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به  آموزش دیتابیس Sqlite و نمایش آن در ListView در برنامه نویسی اندروید می پردازیم قبلتر آموزش های مربوط به Sqlite و ListView را به طور جداگانه برای شما قرار داده بودیم ولی دوستان نمی توانستند ارتباط بین دیتابیس Sqlite و listView را برقرار کنند در این پست با استفاده از یک آداپتور سفارشی داده ها را پس گرفتن از دیتابیس در ListView قرار خواهیم داد با ما همراه باشید.
ابتدا در layout خودتان که در اینجا نام آن برابر با activity_main.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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/simpleListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
</RelativeLayout>

در بالا یک ListView در layout خودمان قرار داده ایم تا داده های درون دیتابیس Sqlite را نمایش دهیم.
باید یک فایل جاوا به نام DatabaseHelper.java ایجاد کنید و کد های زیر را در آن قرار دهید.

package ir.programchi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabaseLockedException;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
/**
 * Created by Jfp on 1/24/2017.
 */
public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "programchi.db";
    public static final String CARS_TABLE_NAME = "CarNumber";
    public static final String CARS_COLUMN_ID = "id";
    public static final String CARS_COLUMN_NAME = "c_number";
    public static final String CARS_COLUMN_COLOR = "c_Color";
    public static final String CARS_COLUMN_PLACE = "c_Place";
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table  " +           CARS_TABLE_NAME+
                   "(_id integer primary key AUTOINCREMENT NOT NULL,"+  CARS_COLUMN_NAME+
                   " Text,"+                    CARS_COLUMN_COLOR+
                   " Text,"+                    CARS_COLUMN_PLACE+
                   " Text)"
        );
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS "+ DATABASE_NAME);
        onCreate(db);
    }
    public boolean insertPlate(int number, String color, String place) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("c_number", number);
        contentValues.put("c_Color", color);
        contentValues.put("c_Place", place);
        db.insert(CARS_TABLE_NAME, null, contentValues);
        return true;
    }
    public ArrayList<Cars> getData() {
        SQLiteDatabase db = this.getReadableDatabase();
        ArrayList<Cars> car= new ArrayList<Cars>();
        Cursor result = db.rawQuery("select * from "+CARS_TABLE_NAME , null);
        while(result.moveToNext()){
           car.add( new Cars(result.getString(result.getColumnIndex(CARS_COLUMN_COLOR))
           ,result.getString(result.getColumnIndex(CARS_COLUMN_NAME))
           ,result.getString(result.getColumnIndex(CARS_COLUMN_PLACE))));
        }
        return car;
    }
    public boolean updatePlates(int id, int number, int color, int place) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("c_number", number);
        contentValues.put("c_Color", color);
        contentValues.put("c_Place", place);
        db.update(CARS_TABLE_NAME, contentValues, "id = ? ", new String[]{Integer.toString(id)});
        return true;
    }
    public Integer deletePlates(Integer id) {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.delete(CARS_TABLE_NAME,
                "id = ? ",
                new String[]{Integer.toString(id)});
    }
    public void insertSomeCars() {
        insertPlate(1,"Blue","Honda Civic");
        insertPlate(2,"Brown","Rolls Royce");
        insertPlate(3,"Blue","Honda Civic");
        insertPlate(4,"Black","Nissan Patrol <3");
        insertPlate(5,"Yellow","Tiida");
        insertPlate(6,"Grey","Rolls Royce");
    }
}

کار اصلی را این کلاس انجام میدهد کارهای از جمله ساختن دیتابیس و در کل structure کار اصلی دیتابیس  و همینطور insert کردن و بررسی بعضی از شرایط. قبلا آموزش Sqlite را در سایت قرار داده ایم در صورتی که مبتدی هستید وازه Sqlite را در سایت جستجو کنید.
حالا باید یک کلاس درست کنیم که عملیات get و set را برای هر ستون از دیتابیس انجام دهد در اینجا ما یک کلاس ساده به نام Cars.java ایجاد کرده و کد های زیر را در آن قرار داده ایم.

package ir.programchi;
/**
 * Created by JFP on 1/24/2017.
 */
public class Cars {
    String name;
    String color;
    String place;
    public Cars(String color, String name, String place) {
        this.color = color;
        this.name = name;
        this.place = place;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPlace() {
        return place;
    }
    public void setPlace(String place) {
        this.place = place;
    }
}

این کلاس به getter و setter نیز معروف هست.
قبل از اینکه آداپتور را ایجاد کنیم یک فایل به نام car_details.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/carName" />
    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/carColor" />
    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/carPlace" />
</LinearLayout>

برای اینکه داریم از آداپتور سفارشی استفاده می کنیم پس نیاز است آیتم های ListView را نیز خودمان ایجاد کنیم و باعث میشه بیشتر بروی آیتم ها منظورم شکل ظاهری آنها کنترل داشته باشیم.
حالا زمان ایجاد آداپتور سفارشی ما برای قرار دادن آیتم ها در ListView است. نام آداپتور ما برابر با MyCustomAdapter.java است.

package ir.programchi;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
/**
 * Created by JFP on 1/24/2017.
 */
public class MyCustomAdapter extends ArrayAdapter{
    private Context context;
    private ArrayList<Cars> car;
    public MyCustomAdapter(Context context, int textViewResourceId, ArrayList objects) {
        super(context,textViewResourceId, objects);
        this.context= context;
        car=objects;
    }
    private class ViewHolder
    {
        TextView carName;
        TextView carColor;
        TextView carPlace;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder=null;
        if (convertView == null)
        {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.car_details, null);
            holder = new ViewHolder();
            holder.carColor = (TextView) convertView.findViewById(R.id.carColor);
            holder.carName = (TextView) convertView.findViewById(R.id.carName);
            holder.carPlace=(TextView)convertView.findViewById(R.id.carPlace);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        Cars individualCar= car.get(position);
        holder.carPlace.setText("Car Place: " +  individualCar.getPlace() + "");
        holder.carName.setText("Car Name: "+ individualCar.getName()+"");
        holder.carColor.setText("Car Color: "+individualCar.getColor());
        return convertView;
    }
}

با استفاده از کد بالا داده ها در ListView قرار خواهند گرفته ولی هنوز فراخوانی نشده اند.
و در آخر کد مربوط به MainActivity.java همانند زیر می شود.

package ir.programchi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
    MyCustomAdapter myCustomAdapter=null;
    ListView listView=null;
    DatabaseHelper db=null;
    ArrayList<Cars> cars=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db= new DatabaseHelper(this);
        cars=db.getData();
        myCustomAdapter= new MyCustomAdapter(this,R.layout.car_details,cars);
        listView = (ListView) findViewById(R.id.simpleListView);
        listView.setAdapter(myCustomAdapter);
    }
}

و در اینجا داده ها در listView قرار می گیرد.
 
این آموزش هم به پایان رسید.
 
موفق و موید باشید.
 

مطالعه بیشتر