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

آموزش دیتابیس اندروید از مبتدی تا پیشرفته – بخش ۵

بعد از آشنا شدن با مقدمات دیتابیس در بخش‌های یک تا سه، توی بخش قبلی شروع کردیم به استفاده ساختار یافته و حرفه‌ای از دیتابیس اندروید.

توی این بخش یک نمونه پروژه دیتابیس اندروید جامع و کامل رو گام به گام توضیح میدیم تا بتونید راحت پیاده سازی کنید و دیتابیس رو بهتر یاد بگیرید.

توی این پروژه نمایش اطلاعات در یک لیست‌ویو و همینطور عملیات اضافه کردن به لیست، جستجو، حذف کردن و ادیت کردن رو یاد میگیرید.

اگر با دیتابیس و مباحث اولیه آشنایی ندارید لازمه ابتدا بخش اول رو از ایـنــجــــا مطالعه کنید.

این آموزش برای کسانی مناسبه که آشنایی حداقلی با کاستوم کردن لیست ویو دارن.

خلاصه پروژه

توی این پروژه قراره تمام عملیات ممکن روی دیتابیس رو پیاده سازی کنیم. ما قراره برنامه‌ای بسازیم که اطلاعات کارمندان یک شرکت رو نمایش بدیم. این اطلاعات شامل اسم، تلفن تماس و آدرس میشه. امکان اضافه کردن یک کارمند جدید، حذف کارمند، تغییر اطلاعات یک کارمند و جستجو رو داریم.

صفحه اصلی ما شامل دو تا دکمه اضافه کردن و جستجو هست که با زدن اونها قسمت‌های مخصوص به خودشون ظاهر میشن و در زیر اونها یک ListView قرار داره. توی لیست در کنار نمایش اطلاعات، برای هر آیتم امکان پاک کردن یا حذف کردن اون وجود داره.

میتونید از انتهای این مطلب، نمونه پروژه دیتابیس اندروید رو به صورت کامل دانلود کنید.

پروژه نهایی به شکل زیر خواهد بود.

http://s5.picofile.com/file/8284293026/database_05_demo.gif

 

پیاده سازی

یک پروژه جدید بسازید که صورت پیش فرض یک اکتیویتی به اسم MainActivity و یک فایل ظاهر به اسم activity_main خواهد داشت.

حالا مرحله به مرحله جلو میریم. ابتدا با طراحی ظاهر برنامه شروع میکنیم.

توی پوشه layout یک فایل xml جدید به اسم search_bar بسازید و کدهای زیر رو داخلش کپی کنید.

search_bar.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="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btn_do_search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="جستجو"
        android:textSize="18dp" />

    <EditText
        android:id="@+id/edt_search"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="right"
        android:imeOptions="actionSearch"
        android:hint="نام کارمند"
        android:textSize="18dp" />

    <Button
        android:id="@+id/btn_close_search"
        android:layout_width="42dp"
        android:layout_height="48dp"
        android:text="×"
        android:textSize="24dp" />

</LinearLayout>

 

یک فایل xml جدید در پوشه layout به اسم add_edit_employee بسازید و کدهای زیر رو داخل قرار بدید.

add_edit_employee.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="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/edt_employee_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:imeOptions="actionNext" />

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="نام کارمند:"
            android:textSize="18dp" />

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/edt_employee_phone"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:imeOptions="actionNext" />

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="شماره تماس:"
            android:textSize="18dp" />

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/edt_employee_address"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:imeOptions="actionNext" />

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="آدرس:"
            android:textSize="18dp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="انصراف"
            android:textColor="#333333"
            android:textSize="18dp" />

        <Button
            android:id="@+id/btn_submit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="تایید"
            android:textColor="#333333"
            android:textSize="18dp" />

    </LinearLayout>

</LinearLayout>

 

حالا میریم سراغ فایل ظاهر صفحه اصلی‌مون یعنی main_activity.xml

این فایل رو باز کنید و کدهای زیر رو داخل قرار بدید. توی این صفحه از دو تا فایل قبلی به صورت include استفاده شده که به صورت پیش فرض دیده نمیشن و خصوصیت visibility اونها برابر Gone هست.

main_activity.xml

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

    <LinearLayout
        android:id="@+id/lin_add_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="اضافه کردن"
            android:textColor="#333333"
            android:textSize="18dp" />

        <Button
            android:id="@+id/btn_search"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="جستجو"
            android:textColor="#333333"
            android:textSize="18dp" />

    </LinearLayout>

    <include
        android:id="@+id/search_bar"
        android:visibility="gone"
        layout="@layout/search_bar"/>

    <include
        android:id="@+id/add_edit_employee"
        android:visibility="gone"
        layout="@layout/add_edit_employee"/>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

 

حالا آیتم‌های لیستمون رو طراحی میکنیم. یک فایل xml جدید توی پوشه layout به اسم list_item بسازید و کدهای زیر رو داخلش قرار بدید.

list_item.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="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:paddingRight="8dp"
    android:paddingTop="5dp">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/btn_edit"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="ویرایش"
            android:textSize="16dp" />

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="حذف"
            android:textSize="16dp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt_employee_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:gravity="right"
            android:text="نام کارمند"
            android:textColor="#333333"
            android:textSize="18dp" />

        <TextView
            android:id="@+id/txt_employee_phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:gravity="right"
            android:text="شماره تماس"
            android:textColor="#333333"
            android:textSize="18dp" />

        <TextView
            android:id="@+id/txt_employee_address"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:text="آدرس"
            android:textColor="#333333"
            android:textSize="18dp" />

    </LinearLayout>

</LinearLayout>

 

کدهای جاوا

ابتدا کدهای مربوط به دیتابیس رو مینویسیم و بعد سراغ پیاده سازی آداپتر لیست ویو و استفاده از کدهای دیتابیس میریم.

یک کلاس جاوا جدید بسازید و اسم اون رو MyDatabase بذارید. توی این کلاس عملیات ساخت دیتابیس و جدول رو انجام میدیم. کدهای زیر رو داخل کلاس کپی کنید.

MyDatabase.java

package your.package.name;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabase extends SQLiteOpenHelper {

    private final static String DB_NAME = "database";
    private final static int DB_VERSION = 1;

    public static final String tableEmployees = "employees";
    public static final String ID = "id";
    public static final String NAME = "name";
    public static final String PHONE = "phone";
    public static final String ADDRESS = "address";

    public MyDatabase(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase mydb) {

        mydb.execSQL("CREATE TABLE IF NOT EXISTS "+ tableEmployees + " (" +
                ID + " INTEGER PRIMARY KEY, " +
                NAME + " TEXT, " +
                PHONE + " TEXT, " +
                ADDRESS + " TEXT);");
    }

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

    }
}

اسم پکیج خودتون رو ابتدای کلاس جایگزین کنید.

برای اینکه انتقال اطلاعات از دیتابیس به سایر کلاس‌ها راحت تر انجام بشه و بتونیم ازشون استفاده کنیم، یک کلاس برای ذخیره اطلاعات کارمندان به اسم Employee بسازید و کدهای زیر رو داخلش قرار بدید.

Employee.java

package your.package.name;

public class Employee {
 
 private int id;
 private String name;
 private String phone;
 private String address;

 public String getPhone() {
 return phone;
 }

 public void setPhone(String phone) {
 this.phone = phone;
 }

 public int getId() {
 return id;
 }

 public void setId(int id) {
 this.id = id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public String getAddress() {
 return address;
 }

 public void setAddress(String address) {
 this.address = address;
 }
}

 

حالا نوبت میرسه به کلاسی که قراره عملیات مختلف رو روی دیتابیس انجام بده. یک کلاس جدید به اسم DatabaseHelper بسازید و کدهای زیر رو داخلش قرار بدید.

این کلاس دارای ۵ تابع به ترتیب برای اضافه کردن کارمند جدید، گرفتن لیست کارمندان، تغییر اطلاعات یک کارمند، حذف یک کارمند و جستجو بر اساس نام هست.

DatabaseHelpe.java

package your.package.name;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;

public class DatabaseHelper {
    
    private SQLiteDatabase mydb;
    
    public DatabaseHelper(Context context){
        mydb = new MyDatabase(context).getWritableDatabase();
    }
    
    public void addNewEmployee(Employee employee){
        ContentValues values = new ContentValues();
        values.put("name", employee.getName());
        values.put("phone", employee.getPhone());
        values.put("address", employee.getAddress());
        
        mydb.insert(MyDatabase.tableEmployees, null, values);
        mydb.close();
    }
    
    public List<Employee> getListOfEmployees(){
        
        Cursor c = mydb.rawQuery("select * from " + MyDatabase.tableEmployees, null);
        List<Employee> employees = new ArrayList<>();
        
        while (c.moveToNext()){
            
            Employee em = new Employee();
            em.setId(c.getInt(c.getColumnIndex(MyDatabase.ID)));
            em.setName(c.getString(c.getColumnIndex(MyDatabase.NAME)));
            em.setPhone(c.getString(c.getColumnIndex(MyDatabase.PHONE)));
            em.setAddress(c.getString(c.getColumnIndex(MyDatabase.ADDRESS)));
            
            employees.add(em);
        }
        
        c.close();
        mydb.close();
        return employees;
    }
    
    public void editEmployee(Employee employee){
        ContentValues values = new ContentValues();
        values.put("name", employee.getName());
        values.put("phone", employee.getPhone());
        values.put("address", employee.getAddress());
        
        mydb.update(MyDatabase.tableEmployees, values, "id = " + employee.getId(), null);
        mydb.close();
    }
    
    public void deleteEmployee(Employee employee){
        mydb.delete(MyDatabase.tableEmployees, "id = " + employee.getId(), null);
        mydb.close();
    }

    public List<Employee> searchByName(String name){

        Cursor c = mydb.rawQuery("select * from " + MyDatabase.tableEmployees + " where name like '%" + name + "%'", null);
        List<Employee> employees = new ArrayList<>();

        while (c.moveToNext()){

            Employee em = new Employee();
            em.setId(c.getInt(c.getColumnIndex(MyDatabase.ID)));
            em.setName(c.getString(c.getColumnIndex(MyDatabase.NAME)));
            em.setPhone(c.getString(c.getColumnIndex(MyDatabase.PHONE)));
            em.setAddress(c.getString(c.getColumnIndex(MyDatabase.ADDRESS)));

            employees.add(em);
        }

        c.close();
        mydb.close();
        return employees;
    }
    
}

 

حالا نوبت میرسه به کلاس آداپتر لیست‌ویو. این کلاس اطلاعات رو به صورتی لیستی از Employee میگیره و اونها رو توی لیست ویو نمایش میده. توی تابع getView ما عملیات مقداردهی هر آیتم لیست‌ویو رو با استفاده از position اون آیتم انجام میدیم. همینطور تعریف میکنیم در صورت کلیک شدن دکمه حذف و ویرایش چه اتفاقی بیفته.

یک کلاس به اسم MyListAdapter بسازید و کدهای زیر رو داخلش کپی کنید.

MyListAdapter.java

package your.package.name;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;

class MyListAdapter extends BaseAdapter {

    private Context context;
    private List<Employee> employees;

    MyListAdapter(Context context, List<Employee> employees){
        this.context = context;
        this.employees = employees;
    }

    @Override
    public int getCount() {
        return employees.size();
    }

    @Override
    public Object getItem(int i) {
        return employees.get(i);
    }

    @Override
    public long getItemId(int i) {
        return employees.get(i).getId();
    }

    @Override
    public View getView(final int position, View view, ViewGroup viewGroup) {

        View rowView = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false);
        TextView txtName = (TextView) rowView.findViewById(R.id.txt_employee_name);
        TextView txtPhone = (TextView) rowView.findViewById(R.id.txt_employee_phone);
        TextView txtAddress = (TextView) rowView.findViewById(R.id.txt_employee_address);
        Button btnEdit = (Button) rowView.findViewById(R.id.btn_edit);
        Button btnDelete = (Button) rowView.findViewById(R.id.btn_delete);

        txtName.setText(employees.get(position).getName());
        txtPhone.setText(employees.get(position).getPhone());
        txtAddress.setText(employees.get(position).getAddress());

        btnEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ((MainActivity) context).editEmployee(employees.get(position));
            }
        });

        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DatabaseHelper(context).deleteEmployee(employees.get(position));
                employees.remove(position);
                notifyDataSetChanged();
            }
        });

        return rowView;
    }
}

 

و در نهایت این کدها رو توی کلاس MainActivity قرار بدید.

MainActivity.java

package your.package.name;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private Button btnSubmit;
    private Button btnCancel;
    private ListView listView;
    private MyListAdapter adapter;
    private EditText edtSearch, edtName, edtPhone, edtAddress;
    private int seletcedEmployeeId;

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

        Button btnAdd = (Button) findViewById(R.id.btn_add);
        Button btnShowSearch = (Button) findViewById(R.id.btn_search);
        Button btnCloseSearch = (Button) findViewById(R.id.btn_close_search);
        Button btnDoSearch = (Button) findViewById(R.id.btn_do_search);
        btnCancel = (Button) findViewById(R.id.btn_cancel);
        btnSubmit = (Button) findViewById(R.id.btn_submit);

        edtSearch = (EditText) findViewById(R.id.edt_search);
        edtName = (EditText) findViewById(R.id.edt_employee_name);
        edtPhone = (EditText) findViewById(R.id.edt_employee_phone);
        edtAddress = (EditText) findViewById(R.id.edt_employee_address);

        btnAdd.setOnClickListener(onAddClicked);
        btnShowSearch.setOnClickListener(onShowSearchClicked);
        btnCloseSearch.setOnClickListener(onCloseSearchClicked);
        btnDoSearch.setOnClickListener(onDoSearchClicked);
        btnCancel.setOnClickListener(onCancelbuttonClicked);

        listView = (ListView) findViewById(R.id.listView);
        refreshList();
    }

    private void refreshList() {
        List<Employee> employees = new DatabaseHelper(this).getListOfEmployees();
        adapter = new MyListAdapter(this, employees);
        listView.setAdapter(adapter);
    }

    public void editEmployee(Employee employee) {
        findViewById(R.id.lin_add_search).setVisibility(View.GONE);
        findViewById(R.id.add_edit_employee).setVisibility(View.VISIBLE);
        btnSubmit.setOnClickListener(onEditEmployeeSubmit);
        edtName.setText(employee.getName());
        edtPhone.setText(employee.getPhone());
        edtAddress.setText(employee.getAddress());
        seletcedEmployeeId = employee.getId();
    }

    private View.OnClickListener onAddClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            findViewById(R.id.lin_add_search).setVisibility(View.GONE);
            findViewById(R.id.add_edit_employee).setVisibility(View.VISIBLE);
            btnSubmit.setOnClickListener(onNewEmployeeSubmit);
        }
    };

    private View.OnClickListener onShowSearchClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            findViewById(R.id.lin_add_search).setVisibility(View.GONE);
            findViewById(R.id.search_bar).setVisibility(View.VISIBLE);
        }
    };

    private View.OnClickListener onCloseSearchClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            findViewById(R.id.lin_add_search).setVisibility(View.VISIBLE);
            findViewById(R.id.search_bar).setVisibility(View.GONE);
            edtSearch.setText("");
            refreshList();
        }
    };

    private View.OnClickListener onDoSearchClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String input = edtSearch.getText().toString();
            if (input.length() == 0) {
                Toast.makeText(MainActivity.this, "لطفا قسمتی از نام کارمند را بنویسید", Toast.LENGTH_SHORT).show();
                return;
            }

            List<Employee> employees = new DatabaseHelper(MainActivity.this).searchByName(input);
            adapter = new MyListAdapter(MainActivity.this, employees);
            listView.setAdapter(adapter);
            Toast.makeText(MainActivity.this, employees.size() + " کارمند پیدا شد", Toast.LENGTH_SHORT).show();
        }
    };

    private View.OnClickListener onCancelbuttonClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            edtName.setText("");
            edtPhone.setText("");
            edtAddress.setText("");
            findViewById(R.id.lin_add_search).setVisibility(View.VISIBLE);
            findViewById(R.id.add_edit_employee).setVisibility(View.GONE);
        }
    };

    private View.OnClickListener onNewEmployeeSubmit = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (edtName.getText().length() == 0 || edtPhone.getText().length() == 0 || edtAddress.getText().length() == 0) {
                Toast.makeText(MainActivity.this, "لطفا اطلاعات را وارد کنید", Toast.LENGTH_SHORT).show();
                return;
            }
            Employee employee = new Employee();
            employee.setName(edtName.getText().toString());
            employee.setPhone(edtPhone.getText().toString());
            employee.setAddress(edtAddress.getText().toString());
            new DatabaseHelper(MainActivity.this).addNewEmployee(employee);
            refreshList();
            btnCancel.performClick();
        }
    };

    private View.OnClickListener onEditEmployeeSubmit = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (edtName.getText().length() == 0 || edtPhone.getText().length() == 0 || edtAddress.getText().length() == 0) {
                Toast.makeText(MainActivity.this, "لطفا اطلاعات را وارد کنید", Toast.LENGTH_SHORT).show();
                return;
            }
            Employee employee = new Employee();
            employee.setId(seletcedEmployeeId);
            employee.setName(edtName.getText().toString());
            employee.setPhone(edtPhone.getText().toString());
            employee.setAddress(edtAddress.getText().toString());
            new DatabaseHelper(MainActivity.this).editEmployee(employee);
            refreshList();
            btnCancel.performClick();
        }
    };
}

 

پایان کار

خب حالا پروژه رو اجرا کنید. در صورتی که خطایی نداشته باشید پروژه باید به خوبی کار کنه.

میتونید از کدهای این پروژه استفاده کنید و گسترش بدید اونها رو. یا میتونید به عنوان قالب کلی جای دیگه ازشون استفاده کنید.

هر سوال یا ابهامی داشتید لطفا از طریق کامنت مطرح کنید.

 

این پروژه با اندروید استودیو و مشخصات زیر نوشته شده:

gradle: 2.2.3

compileSdkVersion 25

buildToolsVersion 25.0.1

در صورتی که توی اجرا مشکل داشتید باید توی فایل gradle اندروید استودیو اطلاعات مربوط به ورژن‌های خودتون رو وارد کنید.

دانلود نمونه پروژه دیتابیس اندروید (کلیک کنید)

 

در ادامه …

در آینده کار با دیتابیس آماده توی اندروید و یک سری مسائل دیگه رو یاد میگیریم.

آموزش استفاده از دیتابیس آماده

من عاشق برنامه‌نویسی، یاد گرفتن و آموزش دادن هستم. انجام کارای جدید توی برنامه‌نویسی رو بیشتر به چشم سرگرمی میبینم تا کار.

حجت ریحانه

من عاشق برنامه‌نویسی، یاد گرفتن و آموزش دادن هستم. انجام کارای جدید توی برنامه‌نویسی رو بیشتر به چشم سرگرمی میبینم تا کار.

29 ديدگاه بر “آموزش دیتابیس اندروید از مبتدی تا پیشرفته – بخش ۵

    1. سلام
      چیزی که میگین خیلی کلی هست. مسلما باید با برنامه نویسی اندروید تا حدی آشنا باشید و تجربه داشته باشید.
      اما اگر صرفا تماس با شرکت هست و کارهای محاسباتی، لازم نیست با دیتابیس کار کنید.

  1. سلام
    اگه کلی مقدار داشته باشیم و بخواهیم اونایی که تکراریه رو پیدا و حذف کنیم
    چیکار باید بکنیم؟؟
    اگه عکس هم تو دیتابیس بخوایم بذاریم یکم توضیح بدید مرسی

    1. سلام
      راه‌حل سوال شما بستگی به ساختار جدولتون و اینکه هر از چندگاه میخواین این اتفاق بیافته داره.
      یک راه تقریبا ساده ولی از نظر پردازشی سنگین اینه که به ازای هر سطر بیاین و توی جدول کوئری بزنین و اگر تکراری داشت حذف کنین.
      اما یک راه دیگه استفاده از group by هست که بر اساس یک ستون انجام میشه و فقط مقادیر غیر تکراری رو نشون میده. میتونید با استفاده از اون خروجی رو بگیرید و توی یک جدول دیگه مقادیر غیر تکراری رو ذخیره کنید.
      راه‌حل استانداردی شاید براش نباشه، یا حداقل من ندونم.

      ذخیره عکس رو هم انشاءالله توی آموزش‌ها قرار میدم.

  2. مرسی
    اگه میشه یه همچین پروژه ای رو با Recycleview درست کنین که بشه خودمون دستی عکس وارد دیتابیس قرار بدیم
    مثل همین نمونه کار که خودمون اسم تلفن رو وارد میکنیم بشه همینجوری عکسم وارد کرد

    ی مشکل دیگه ای هم دارم کل کد های بالا رو کپی کردم فقط ی جا ارور میده هر چی هم نگاه میکنم ب ظاهر درسته ولی ارور نمیره

    اینجا گیر کردم
    public void editEmployee(Employee employee) {
    findViewById(R.id.lin_add_search).setVisibility(View.GONE);
    findViewById(R.id.add_edit_employee).setVisibility(View.VISIBLE);
    btnSubmit.setOnClickListener(onEditEmployeeSubmit);
    edtName.setText(employee.getName());
    edtPhone.setText(employee.getPhone());
    edtAddress.setText(employee.getAddress());
    seletcedEmployeeId = employee.getId();
    }

    این خط add_edit_employee قرمز میشه میگه همچین چیزی نیست باید چیکار کرد؟

    1. سلام
      انشاءالله اگر فرصت شد همچین آموزشی هم قرار میدیم

      مشکل اینه که این آیدی رو پیدا نمیکنه
      این آیدی توی فایل activity_main.xml باید تعریف شده باشه
      توی دومین include باید آیدی برابر add_edit_employee باشه

      توی مطلب تصحیح شد.

  3. سلام
    کدهای برنامه رو کپی کردم خطایی نداره ولی وقتی ازش خروجی گرفتم
    برنامه رو تو گوشیم نصب کردم کرش میکنه میاد بیرون یعنی اصلا وارد برنامه نمیشه
    رو ایکون برنامه میزنم کرش میکنه مشکلش چی میتونه باشه؟

    1. سلام

      کدهای این پروژه تست شده و خطایی توی کدها نیست.
      احتمالا خطای شما از بخش دیگه‌ای باشه.
      امکانش هست لاگ خطا رو قرار بدید؟
      از قسمت Android Monitor در اندروید استودیو

    1. سلام
      نه پیچیدگی خاصی نداره
      باید یک ستون داشته باشید از نوع blob که بتونید عکس رو ذخیره کنید داخلش
      و بعد عکس رو به شکل آرایه بایت مقدار بدید.
      در فرصت مناسب آموزش ذخیره تصویر رو هم قرار میدم. اما تا اون موقع شما میتونید با یک جستجوی ساده این کار رو یاد بگیرید.

  4. من تونستم تصویر رو از گالری بگیرم و توی دیتابیس ذخیر کنم حالا وقتی دکمه ویرایش رو میزنم همه اطلاعات میاد ولی نمیدونم چجوری تصویر و نمایش بدم و ویرایشش کنم
    اینم کدی که نوشتم ولی ارور داره قسمت مربوط به ImageView
    http://upir.ir/951/guest/Capture_d5990.png

  5. سلام وقتتون بخیر .من میخوام یک سری کتاب رو از حافظه بگیرم و به برنامم اضاف کنم و اونارو دسته بندی کنم ونمایش بدم.میشه تو دیتابیسش منو راهنمایی کنین

  6. من از لیست ویو آیتمهارو میفرستم به دیتا بیس و با یه متد آی دی هر ایتم رو میگیرم
    اما اگه آیتمهای داخل لیست یکی باشه
    ( مثلا دوتا اسم هم نام )
    همون آی دی رو به جفتشون اختصاص میده … نمیدونن چرااا!
    در صورتی که ستون ای دی primarykay و unique هستش

    1. خب این کار شما درست نیست
      شما علاوه بر اسم هایی که توی لیست نشون میدین، باید آیدی اونها رو هم قبلا از دیتابیس بگیرین و توی آداپتر به شکل یک آرایه یا لیست ذخیره کنید تا این مشکل براتون پیش نیاد و هر زمان به آیدی نیاز داشتین، با position‌ از اون آرایه بگیریدش.

  7. با سلام
    بنده کمی شخصی سازی کردم کدهای شما رو

    ینی از یک اکتیویتی اطلاعات رو وارد کردم و دکمه ثبت رو میزنم و در تکست ویوی یک اکتیویتی دیگه میخوام پیادش کنم.

    اما مشکلی که هست وقتی میخوام وارد اون اکتیویتی بشم که تکست ویو توشه فورس کلوز میده

    برا همین اومدم تو همون اکتیویتی ثبت اطلاعات یه تکست ویو گذاشتم و اون بخش setName رو آیدیش رو به این تکست ویو کست کردم.
    اما باز هم متنی داخلش قرار نمیگیره

    بعدش من اومدم یه نگاهی به کدهام کردم کدی که دیتابیس رو باهاش بسازم ننوشته بودم اصلا، ینی توی کدهای شما همچین کدی نبود
    رفتم توی فایل منیجر امولیتورم هم کلی گشتم فایل دیتابیس رو پیدا نکردم به هر حال اگه ساخته شده بود باید یه جایی ذخیره میشد.

    ممنون میشم راهنمایی کنید

    1. سلام و وقت بخیر
      توی این نمونه پروژه کلاسهای MyDatabase و DatabaseHelper وظیفه ساخت و کار با دیتابیس رو دارن.
      اگر مشکلی توی پیاده سازی دارید لازمه بخشهای قبلی این آموزش رو به دقت مطالعه کنید.

  8. سلام مجدد
    استاد عزیز در ابتدا عرض کنم که من تازه نمونه کارای شما رو توی بازار دیدم و واقعا باید اعتراف کنم شما و تیمتون مایه مباهات حوزه برنامه نویسی ایران هستید.

    بنده کدی نوشتم که ممنون میشم اگه به این تصاویر یه نگاه بندازید و بگید مشکل کار از کجاست.
    یعنی من این کدا رو نوشتم ولی وقتی توی اکتیویتی درج اطلاعات دکمه btn_add (توی تصویر معلومه) رو میزنم force close میده..

    قبلش عرض کنم که اگر این خواسته منو زیاده خواهی بدونید و نظرم رو اصلا تایید نکنید یا تایید کنید و پاسخ ندید به هیچ وجه ناراحت نخواهم شد.ولی اگر جواب بدید واقعا منت گذاشتین بر سر ما استاد.

    این تصاویر مربوط ب کلاس ِMyDatabase هستش:
    http://uupload.ir/files/vl9_descrip_001.png
    http://uupload.ir/files/9bp_descrip_002.png

    این تصاویر هم مربوط به کلاس DatabaseHelper هستش:
    http://uupload.ir/files/zrob_descrip_003.png
    http://uupload.ir/files/5vln_descrip_004.png
    http://uupload.ir/files/ufpl_descrip_005.png
    http://uupload.ir/files/cqjr_descrip_006.png

    این هم تصاویر مربوط به همون اکتویتی هست که از اون طریق میخوام توی دیتابیس insert کنم اطلاعات رو:(عرض کنم که اطلاعاتی که رو توی پرانتز insert نوشتم اطلاعاتی هستش که از edit text و spinner و بقیه فیلدها میخوام بگیرم و توی دیتابیس قرار بدم.)
    http://uupload.ir/files/j0v_descrip_007.png

    و در انتها این هم کدی که تو یه اکتیویتی دیگه نوشتم که چنتا از اطلاعات رو از دیتابیس بگیرم و توی چنتا تکست یو نشون بدم. (که البته توی card view و recycler view هستش):
    http://uupload.ir/files/kihc_descrip_008.png

    در انتها باز هم معذرت که کمی زیاده خواهی کردم و باز هم میگم اگر وقتتون گرفته میشه و نمیتونید جواب بدید من اصلا ناراحت نمیشم.
    موفق باشید.
    یا علی

    1. سلام و وقت بخیر
      ممنون از نظر لطف شما

      حقیقت اینه که اشکالات برنامه رو نمیشه به این شکل متوجه شد. هم اینکه حجم کدها زیاده و هم اینکه اشکال میتونه از هرجایی غیر از چیزی که فکر میکنید باشه.
      مثلا توی کدهای شما من اشکالی ندیدم، اما اشکال میتونه از این باشه که یکی از ویوهای شما مثل editText هاتون درست با آیدی مقداردهی نشده باشه
      یا مثلا وقتی دارید مقدار داخل editText ها رو تبدیل به عدد میکنید، اون مقدار خالی باشه یا عدد نباشه
      اینها چیزایی هست که ربطی به دیتابیس نداره ولی باعث ایجاد فورس کلوز میشه

      بهترین راه برای خطایابی پروژه استفاده از logCat هست. هر فورس کلوزی که توی برنامه ایجاد میشه، اطلاعات اون خطا توی لاگ کت نوشته میشه، که اکثرا به طور دقیق اشاره میکنه به همون خطی که این خطا داخلش رخ داده.
      اگر از اندروید استودیو استفاده میکنید میتونید از قسمت Android monitor در پایین صفحه، لاگهای برنامتون رو موقع اجرا در شبیه ساز ببینید.

      امیدوارم موفق باشید

  9. سلام مجدد
    باز هم تشکر و معذرت از اینکه زیاد مزاحم میشم

    جسارتا میخواستم بدونم چطور میتونم توی دیتابیس عدد زیاد وارد کنم
    ینی از ۱۰تا بیشتر میشه ارور میده
    نوع ورودی رو هم توی جدول از عدد به تکست تغییر دادم ولی باز هم فایده نداره

    1. سلام
      خطای شما از سمت دیتابیس نیست، از سمت اندروید هست برای تبدیل اون عدد طولانی به int
      مقادیر عددی در اندروید محدودیت دارن، برای جلوگیری از این خطا، عددتون رو یا به long تبدیل کنید یا به شکل String توی اندروید بگیرید و در دیتابیس هم به شکل text ذخیره کنید.

      محدودیت اعداد int در اندروید تا ۲,۱۴۷,۴۸۳,۶۴۸ هست و اعداد بزرگتر رو ساپورت نمیکنه
      محدودیت اعداد long هم در جاوا تا ۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۷ هست و عددتون اگر باز از این بزرگتر باشه خطا میگیرید

  10. سلام خسته نبایشید من فقط یه دیتابیس میخوام دوتا ورودی داشته باشه نام و محتوا که توش وارد کنی و بتونی دوباره پاکش کنی این کدا خیلی پیچیدست من نمیتونم ایمیلمم ممنون میشم راهنمایی کنید

  11. سلام
    با تشکر چگونه میتونم این بخش از کد رو طوری اصلاح کنیم که وابسته به اکتیوتی خاصی نباشه
    ((MainActivity) context).editEmployee(employees.get(position));
    و از اکتیوتی مختلف فراخوانی بشه

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *