آموزشهای پراکنده از دنیای برنامه نویسی اندروید
به نام خدا
این آموزش برای ساخت برنامه از روی دیتابیس موجود کاربرد دارد و تقریبا میشه گفت ساده ترین راه موجود می باشد.
روش کار
1.ابتدا یک پروژه ای جدید با اکتیویتی MainActivity ایجاد کنید.
2. در فایل گریدل app هم کد های زیر را وارد نمایید تا کتابخانه های مورد نیاز به پروژه اضافه بشود.
compile 'com.android.support:recyclerview-v7:25.0.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.github.satyan:sugar:1.5'
3. پس از اضافه شدن کتابخانه ها در منیفست دسترسی های لازم را اضافه نمایید.
<uses-permission android:name="android.permission.INTERNET" /> // دسترسی اینترنت
4. ابتدا تنظیمات دیتابیس را برای sugarorm وارد منیفست می کنیم. تگ های meta-data به شکل زیر خواهد بود.
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="DATABASE"
android:value="x.sqlite" /> // نام فایل دیتابیس
<meta-data
android:name="VERSION"
android:value="1" />
<meta-data
android:name="QUERY_LOG"
android:value="true" />
<meta-data
android:name="DOMAIN_PACKAGE_NAME"
android:value="ir.technopedia.sugarorm" /> // پکیج نیم اپلیکیشن
</application>
5. حال فایل دیتابیس را به فولدر assets پروژه اضافه کنید.
6. یک کلاس جدید به اسم MyApplication بسازید و بصورت زیر تغییرش دهید.
کلاس از SugarApp مشتق شده است برای کارکردن کدهای دیتابیس و تابع copyFile از فولدر assets فایل ها را کپی می کند. در تابع onCreate فایل دیتابیس کنترل شده است اگر موجود نبود از فولدر assets به جای دیتابیس برنامه کپی می شود.
ویرایش : توجه کنید دستورات کنترل و کپی دیتابیس رو قبل از دستور super.onCreate(); در کلاس MyApplication قرارداده بشه.
public class MyApplication extends SugarApp {
@Override
public void onCreate() {
File db = new File(getApplicationInfo().dataDir + "/databases/x.sqlite"); // فایل در فولدر databases دایرکتوری دیتای خود برنامه هست .
if (!db.exists()) { // اگر فایل دیتابیس موجود نباشد
copyFile(getBaseContext(), "x.sqlite", getApplicationInfo().dataDir + "/databases/"); // کپی می شود
}
super.onCreate();
}
public boolean copyFile(Context context, String inputFile, String outputPath) { // تابع کپی فایل از assets پارامتر دوم برای نام فایل در فولدر است می باشد و پارامتر سوم جایی که قرار هست کپی شود.
// در صورتی که می خواهید برنامه به مموری اصلی گوشی کپی کن باید دسترسی WRITE_EXTERNAL_STORAGE را اضافه کنید.
InputStream in = null;
OutputStream out = null;
try {
File dir = new File(outputPath);
if (!dir.exists()) {
dir.mkdirs();
}
in = context.getAssets().open(inputFile);
out = new FileOutputStream(outputPath + inputFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (FileNotFoundException fnfe1) {
return false;
} catch (Exception e) {
return false;
}
return true;
}
}
7. کلاس MyApplication را در AndroidManifest.xml تگ application به شکل زیر اضافه کنید.
<application
android:name=".MyApplication" // تغییر انجام یافته
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
8. حال برای داده های جدول یک فایل مدل به اسم Phone می سازیم.
جدول موجود در برنامه با نام PHONE می باشد. کلاس به صورت Phone ایجاد می کنیم.
فیلد های تیبل عبارتند از : ID,TITLE,LINK,IMG,DATA,CAT_ID که در کلاس مدل با حرف های کوچک به شکل زیر ایجاد می شود.
کلاس Phone از SugarRecord مشتق شده است.
public class Phone extends SugarRecord{
// فیلد id در کلاس والد می باشد.
public String title, link, img, data;
public int cat_id;
}
9. حال برای نمایش باید اداپتر ایجاد کرد.
فایل item_phone.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:layout_margin="4dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="120dp"
android:layout_margin="8dp"
android:layout_marginBottom="50dp"
android:adjustViewBounds="true" />
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="8dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="Acer Iconia"
android:textSize="24dp" />
</LinearLayout>
</LinearLayout>
فایل PhoneAdapter را نیز بصورت زیر ایجاد می کنیم.
public class PhoneAdapter extends RecyclerView.Adapter<PhoneAdapter.PhoneHolder> {
List<Phone> mDataset;
Context context;
public PhoneAdapter(Context context, List<Phone> myDataset) {
this.mDataset = myDataset;
this.context = context;
}
@Override
public PhoneHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_phone, parent, false);
PhoneHolder dataObjectHolder = new PhoneHolder(view);
return dataObjectHolder;
}
@Override
public void onBindViewHolder(PhoneHolder holder, int position) {
holder.title.setText(mDataset.get(position).title);
Picasso.with(context)
.load(mDataset.get(position).img)
.placeholder(android.R.drawable.star_off)
.into(holder.img);
}
public void addItem(Phone dataObj, int index) {
mDataset.add(dataObj);
notifyItemInserted(index);
}
public void update(List<Phone> list) {
mDataset = list;
notifyDataSetChanged();
}
public void deleteItem(int index) {
mDataset.remove(index);
notifyItemRemoved(index);
}
@Override
public int getItemCount() {
return mDataset.size();
}
public static class PhoneHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView img;
public PhoneHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
img = (ImageView) itemView.findViewById(R.id.img);
}
}
}
10. حال فایل activity_main.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="horizontal">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
11. فایل MainActivity.java را نیز به شکل زیر تغییر دهید تا دیتاهای موجود در دیتابیس انتخاب شوند و در ریسایکلر ویو نمایش داده شوند.
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView; // اشاره گر ریسایکلر ویو
LinearLayoutManager linearLayoutManager; // لنیر لیوت منیجر برای تعریف ریسایکلر ویو بصورت لیست عمودی
PhoneAdapter phoneAdapter; // اداپتر برای ست کردن داده ها به ریسایکلر ویو
List<Phone> list; // لیست
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
linearLayoutManager = new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL, false);
list = Phone.listAll(Phone.class); // انتخاب تمامی داده ها از دیتابیس با استفاده از SugarORM
phoneAdapter = new PhoneAdapter(getBaseContext(), list);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(phoneAdapter);
}
}
12. حال برنامه را اجرا کنید و خروجی را ببینید.