سبد (0)

بهترین روش ذخیره سازی

بهترین روش ذخیره سازی اطلاعات

تا اینجا 3 راه مختلف ذخیره سازی اطلاعات در برنامه های اندروید را توضیح دادیم:

  • استفاده از شئ SharedPreferences
  • حافظه ی داخلی
  • حافظه ی خارجی

انتخاب بهترین روش:

اگر اطلاعاتی دارید که در قالب کلید/مقدار قرار می گیرد از شئ SharedPreferences استفاده کنیدبرای مثال اگر می خواهید تنظیمات کاربر از قبیل نام کاربری, رنگ پس زمینه,تاریخ تولد و آخرین زمان ورود به برنامه را ذخیره کنید آنگاه شئ SharedPreferences بهترین انتخاب ممکن می باشد.علاوه بر این, کار با این شئ و استخراج و ذخیره سازی اطلاعات داده شده در آن بسیار آسان خواهد بود.

اگر می خواهید اطلاعات وقت را ذخیره کنید بهترین روش ذخیره بر روی حافظه ی داخلی است.برای مثال اگر برنامه ی شما نیاز به دانلود عکس از فضای وب دارد, ذخیره آن در حافظه ی داخلی پیشنهاد می شود.گاهی اوقات هم ممکن است قصد داشته باشید اطلاعات ورودی کاربر را ذخیره کنید,مثل وقتی که کاربر نوت برداری می کند و به صورت موقت آن رانگهداری می کند تا بعداً  آن را مطالعه کند,باز هم بهترین روش در این موضوع استفاده از حافظه ی داخلی می باشد.

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

استفاده از منابع استاتیک

علاوه بر ایجاد و استفاده از فایل ها به صورت پویا, این امکان وجود دارد تا در زمان طراحی ,یکسری از فایل ها را در پکیج خود قرار داده تا در زمان اجرا از آنها استفاده کنید.برای مثال قصد دارید چند فایل Help درون برنامه خود قرار دهید تا در صورت لزوم به کاربر نمایش داده شوند.برای این کار باید فایل های مورد نظر خود را در فولدر res/raw قرار دهید.که این فولدر را باید خودتان ایجاد کنید.برای استفاده از این فایل ها, از متد ()getResources (از کلاس Activity) برای برگرداندن شئ Resources استفاده می کنیم,سپس از متد ()openRawResources برای باز کردن فایل درون res/raw استفاده می کنیم:

 

import java.io.InputStream;
import java.io.BufferedReader;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InputStream is = this.getResources().openRawResource(R.raw.textfile);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = null;
try {
while ((str = br.readLine()) != null) {
Toast.makeText(getBaseContext(),
str, Toast.LENGTH_SHORT).show();
}
is.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
textBox = (EditText) findViewById(R.id.txtText1);
Button saveBtn = (Button) findViewById(R.id.btnSave);
Button loadBtn = (Button) findViewById(R.id.btnLoad);
saveBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
}
});
loadBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
}
});
}

شناسه ی Resources ی که در فولدر res/raw ذخیره شده است, نام فایل بدون پسوندش می باشد.برای مثال شناسه ی منبع فایل textfile.txt برابر R.raw.textfile می باشد.

ایجاد و استفاده از بانک اطلاعاتی

تا اینجا هر چیزی که یاد گرفتید برای ذخیره سازی اطلاعات با ساختاری ساده بود.برای ذخیره اطلاعات رابطه ای,کار با بانک اطلاعاتی بسیار مفیدتر است.برای مثال,اگر می خواهید نتیجه ی امتحانات تمامی دانش آموزان را ذخیره کنید,بهتر است که از بانک اطلاعاتی برای این کار بهره ببرید.چرا که می توانید از روش های query برای دریافت نتیجه استفاده کنید.علاوه بر این استفاده از بانک اطلاعاتی قابلیت تجمع اطلاعات و ایجاد رابطه های اطلاعاتی را به داده های شما می دهد.

اندروید از بانک اطلاعاتی SQLite استفاده می کند.بانک اطلاعاتی هر برنامه فقط توسط خود آن برنامهخ قابل دسترسی است و دیگر برنامه ها اجازه ی دسترسی به آن را نخواهند داد.در ادامه یاد میگیرید که چگونه به صورت برنامه نویسی و در زمان اجرا بانک اطلاعاتی SQLite ایجاد کنید.در اندروید بانک اطلاعاتی SQLite که برای هر برنامه ایجاد گردد در فولدر data/data/<package_name>/database ذخیره می شود.

ایجاد کلاس کمکی DBAdapter

یک تمرین خوب برای کار با بنک اطلاعاتی,ایجاد کلاس کمکی برای یکپارچه سازی مراحل پیچیده ی دسترسی به داده می باشد.بنابراین در این بخش,یک کلاس کمکی با نام ABAdapte برای ایجاد,بازکردن,بستن و استفاده از SQLite خواهیم ساخت.در این مثال,یک بان اطلاعاتی با نام MyDB که شامل جدول contacts است ایجاد می کنیم.این جدول حاوی سه ستون id_,name و email است.

1.با استفاده از اکلیپس یک پروژه جدید با نام Database ایجاد کنید.

2.یک کلاس جدید در زیر نام پکیج ایجاد کرده و نام آن را DBAdapte بگذارید.

3.فایل DBAdapter.java را به صورت زیر اصلاح کنید:

 

package com.PRG.Databases;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter {
public static final String KEY_ROWID = “_id”;
public static final String KEY_NAME = “name”;
public static final String KEY_EMAIL = “email”;
private static final String TAG = “DBAdapter”;
private static final String DATABASE_NAME = “MyDB”;
private static final String DATABASE_TABLE = “contacts”;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
“create table contacts (_id integer primary key autoincrement, “
+ “name text not null, email text not null);”;
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(DATABASE_CREATE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, “Upgrading database from version “ + oldVersion + “ to “
+ newVersion + “, which will destroy all old data”);
db.execSQL(“DROP TABLE IF EXISTS contacts”);
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---insert a contact into the database---
public long insertContact(String name, String email)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_EMAIL, email);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular contact---
public boolean deleteContact(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + “=” + rowId, null) > 0;
}
//---retrieves all the contacts---
public Cursor getAllContacts()
{
return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
KEY_EMAIL}, null, null, null, null, null);
}
//---retrieves a particular contact---
public Cursor getContact(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_EMAIL}, KEY_ROWID + “=” + rowId, null,
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//---updates a contact---
public boolean updateContact(long rowId, String name, String email)
{
ContentValues args = new ContentValues();
args.put(KEY_NAME, name);
args.put(KEY_EMAIL, email);
return db.update(DATABASE_TABLE, args, KEY_ROWID + “=” + rowId, null) > 0;
}
}

در ابتدا چند متغیر که حاوی فیلدهای مختلف جدولی هستند تعریف می کنیم که قرار است در بانک اطلاعاتی درج شوند:

 

public static final String KEY_ROWID = “_id”;
public static final String KEY_NAME = “name”;
public static final String KEY_EMAIL = “email”;
private static final String TAG = “DBAdapter”;
private static final String DATABASE_NAME = “MyDB”;
private static final String DATABASE_TABLE = “contacts”;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
“create table contacts (_id integer primary key autoincrement, “
+ “name text not null, email text not null);”;

در این مورد خاص ,ثابت DATABASE_CREATE حاوی عبارت SQL است که جدول contacts را در بانک اطلاعاتی MyDB ایجاد می کند.

در کلاس DBAdapter, یک کلاس خصوصی اضافه کردیم که کلاس SQLiteOpenHelper  را پیاده سازی می کند که یک کلاس برای مدیریت ایجاد نسخه های مختلف بانک اطلاعاتی است.همچنین مهمترین متدهای ()onCreate و ()onUpgrade را بازپروری کردیم:

 

public class DBAdapter {
public static final String KEY_ROWID = “_id”;
public static final String KEY_NAME = “name”;
public static final String KEY_EMAIL = “email”;
private static final String TAG = “DBAdapter”;
private static final String DATABASE_NAME = “MyDB”;
private static final String DATABASE_TABLE = “contacts”;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
“create table contacts (_id integer primary key autoincrement, “
+ “name text not null, email text not null);”;
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(DATABASE_CREATE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, “Upgrading database from version “ + oldVersion + “ to “
+ newVersion + “, which will destroy all old data”);
db.execSQL(“DROP TABLE IF EXISTS contacts”);
onCreate(db);
}
}

متد ()onCreate , اگر بانک اطلاعاتی موجود نباشد آن را ایجاد می کند.متد ()onUpgrade هنگامی که بانک اطلاعاتی نیاز به بروزرسانی داشته باشد فراخوانی می گردد.این موضوع از طریق ثابت DATABASE_VERSION به دست می آید.در پیاده سازی متد ()onUpgrade, کافیست جدول را حذف کرده و دوباره ایجاد کنیم.

می توان متدهای زیادی برای باز کردن و بستن بانک اطلاعاتی و همچنین برای افزودن,ویرایش کردن و حذف کردن ردیف ها تعریف نمود.

 

public class DBAdapter {
//...
//...
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
}
//---insert a contact into the database---
public long insertContact(String name, String email)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_EMAIL, email);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular contact---
public boolean deleteContact(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + “=” + rowId, null) > 0;
}
//---retrieves all the contacts---
public Cursor getAllContacts()
{
return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
KEY_EMAIL}, null, null, null, null, null);
}
//---retrieves a particular contact---
public Cursor getContact(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_EMAIL}, KEY_ROWID + “=” + rowId, null,
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//---updates a contact---
public boolean updateContact(long rowId, String name, String email)
{
ContentValues args = new ContentValues();
args.put(KEY_NAME, name);
args.put(KEY_EMAIL, email);
return db.update(DATABASE_TABLE, args, KEY_ROWID + “=” + rowId, null) > 0;
}
}

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

استفاده از Cursor در اندروید,مدیریت ردیف ها و ستون ها را بسیار کارآمدتر می کند.از یک شئ ContentValues برای ذخیره ی اطلاعات در قالب کلید/مقدار استفاده می کنیم.متد ()put این شئ قابلیت افزودن کلید و مقدار را در انواع داده های مختلف به برنامه شما می دهد.

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

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

اضافه کردن contents

تمرین زیر به شما نشان می دهد که چگونه می توانید یک contact را به جدول اضافه کنید.

1. با استفاده از پروژه ای که در قسمت قبل ساختید, فایل MainActivity.java را به صورت زیر تغییر دهید:

 

package com.PRG.Databases;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
//---add a contact---
db.open();
long id = db.insertContact(“Wei-Meng Lee”, “این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید”);
id = db.insertContact(“Mary Jackson”, “این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید”);
db.close();
}
}

2.برنامه را در شبیه ساز اجرا کنید.

روش کار

 در این مثال شما اول یک نمونه از کلاس DBAdapter ایجاد کردید.

 

DBAdapter db = new DBAdapter(this);

متد ()insertContact آی دی ردیف درج شده را بر میگرداند.اگر در طول عملیات خطایی رخ دهد مقدار -1 برگردانده می شود.اگر سیستم فایل شبیه ساز را در حالت DDMS بررسی کرده اید, ملاحظه می فرمائید که فایل MyDB در زیر پوشه database ایجاد گردیده است.

بازیابی همه ی جدول ها

 برای بازیابی همه ی contact ها در جدول contacts, از متد ()getAllContacts کلاس DBAdapter استفاده کنید.به صورت زیر:

1.در همان پروژه ای که در قسمت قبل ایجاد کردید فایل MainActivity.java را به صورت زیر تغییر دهید:

 

package com.PRG.Databases;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import android.database.Cursor;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
/*
//---add a contact---
db.open();
long id = db.insertContact(“Wei-Meng Lee”, “این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید”);
id = db.insertContact(“Mary Jackson”, “این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید”);
db.close();
*/
//---get all contacts---
db.open();
Cursor c = db.getAllContacts();
if (c.moveToFirst())
{
do {
DisplayContact(c);
} while (c.moveToNext());
}
db.close();
}
public void DisplayContact(Cursor c)
{
Toast.makeText(this,
“id: “ + c.getString(0) + “\n” +
“Name: “ + c.getString(1) + “\n” +
“Email: “ + c.getString(2),
Toast.LENGTH_LONG).show();
}
}

2.برنامه را در شبیه ساز اجرا کنید.شکل زیر اطلاعات دریافت شده را بوسیله ی کلاس Toast نمایش می دهد.

روش کار

متد ()getAllContacts کلاس DBAdapter تمامی اطلاعات ذخیره شده در بانک الاعاتی را استخراج می کند.نتیجه به شکل یک شئ Cursor برگردانده می شود.برای نمایش همه ی اطلاعات,ابتدا باید متد ()moveToFirst شئ Cursor را فراخوانی کنیم.اگر با موفقیت انجام شد,(یعنی حئاقل یک ردیف موجود بود) سپس اطلاعات را به وسیله متد ()DisplayContact نمایش می دهیم.برای حرکت به ردیف بعدی از متد ()moveToNext و شئ Cursor استفاده می کنیم.

بازیابی یک ردیف از جدول

برای بازیابی تنها یک ردیف از جدول با استفاده از ID آن , متد ()getContact از کلاس DBAdapter را فراخوانی می کنیم.برای این کار تمرین زیر را انجام دهید:

1.با استفاده از همان پروژه ای که در آموزش قبل ساختید,فایل MainActivity.java را به صورت زیر ویرایش کنید:

 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
/*
//---add a contact---
//...
*/
/*
//---get all contacts---
//...
*/
//---get a contact---
db.open();
Cursor c = db.getContact(2);
if (c.moveToFirst())
DisplayContact(c);
else
Toast.makeText(this, “No contact found”, Toast.LENGTH_LONG).show();
db.close();
}

2.برنامه را در شبیه ساز اجرا کنید.جزئیات جدول با استفاده از کلاس Toast نمایش داده می شود.

روش کار

متد ()updateContact کلاس DBAdapter با استفاده از ID یک ردیف را بر میگرداند.کافیست شناسه ردیف مورد نظر را ارسال کنیم.در این مثال شناسه برابر مقدار 2 بود که نشان دهنده ی ردیف دوم است:

 

Cursor c = db.getContact(2);

نتیجه در قالب یک شئ Cursor برمیگردد.اگر ردیف برگردانده شده باشد, با استفاده از متد ()DisplayContact جزئیاتش را نمایش می دهیم.در غیر این صورت یک پیام به وسیله ی کلاس Toast نمایش داده می شود.

بروزرسانی یک ردیف جدول

برای بروزرسانی یک ردیف خاص,متد ()updateContact کلاس DBAdapter را با ارسال شناسه ردیف فراخوانی می کنیم.

1.با استفاده از همان پروژه قبل فایل MainActivity.java را به صورت زیر ویرایش کنید:

 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
/*
//---add a contact---
//...
*/
/*
//---get all contacts---
//...
*/
/*
//...
*/
//---update contact---
db.open();
if (db.updateContact(1, “Wei-Meng Lee”, “این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید”))
Toast.makeText(this, “Update successful.”, Toast.LENGTH_LONG).show();
else
Toast.makeText(this, “Update failed.”, Toast.LENGTH_LONG).show();
db.close();
}

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

روش کار

متد ()updateContact کلاس DBAdapter با استفاده از شناسه ردیف,جزئیات آن را ویرایش می کند.اگر مقدار از نوع Boolean برگرداند نشان دهنده ی این است که عملیات با موفقیت انجام شده است.

حذف یک contact

برای حذف یک ردیف در جدول, از متد ()deleteContact کلاس DBAdapter و ارسال ID آن استفاده می کنیم.

1.با استفاده از همان پروژه قبل فایل MainActivity.java را به صورت زیر ویرایش کنید:

 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
/*
//---add a contact---
//...
*/
/*
//---get all contacts---
//...
*/
/*
//---get a contact---
//...
*/
/*
//---update contact---
//...
*/
//---delete a contact---
db.open();
if (db.deleteContact(1))
Toast.makeText(this, “Delete successful.”, Toast.LENGTH_LONG).show();
else
Toast.makeText(this, “Delete failed.”, Toast.LENGTH_LONG).show();
db.close();
}

2.برنامه را در شبیه ساز اجرا کنید.پیامی مبنی بر حذف شدن ردیف نمایش داده می شود.

روش کار

متد ()deleteContact کلاس DBAdapter با استفاده از ID یک ردیف را حذف می کند و یک مقدار Boolean را برمیگرداند که حاکی از انجام با موفقیت عملیات است.

بروزرسانی دیتابیس

بعضی اوقات پس از ایجاد دیتابیس و استفاده از آن, نیاز است تا جدولی را به آن اضافه کنیم,تغییراتی را در ظاهر دیتابیس ایجاد کنیم و یا ستون هایی را در جدول کم یا زیاد کنیم.در اینگونه موارد باید از دیتابیس قبلی به دیتابیس جدیدی منتقل شویم.

برای بروزرسانی دیتابیس,ثابت DATABASE_VERSION را به عددی بالاتر از عدد قبل تغییر دهید.برای مثال اگر عدد قبلی برابر 1 بود,آن را یک واحد اضافه کنید و برابر 2 قرار دهید:

 

public class DBAdapter {
public static final String KEY_ROWID = “_id”;
public static final String KEY_NAME = “name”;
public static final String KEY_EMAIL = “email”;
private static final String TAG = “DBAdapter”;
private static final String DATABASE_NAME = “MyDB”;
private static final String DATABASE_TABLE = “contacts”;
private static final int DATABASE_VERSION = 2;

نکته:قبل از اینکه این تمرین را انجام دهید حتماً قسمت کدهای حذف یک ردیف را به صورت کامنت در آوردید.اگر این کار را انجام ندهید به دلیل حذف جدول با خطا روبرو می شوید.

وقتی برنامه را یکبار دیگر اجرا کنید عبارت زیر در پنجره دیالوگ به نمایش در می آید:

 

DBAdapter(24096): Upgrading database from version 1 to 2, which will destroy all
old data

در این مثال,به سادگی جدول موجود را حذف کرده و یکی دیگر ایجاد می کند.در برنامه های واقعی میشه ابتدا از اطلاعات دیتابیس قبلی پشتیبانی بگیرید و سپس نسبت به بروزرسانی آن اقدام کنید.

دیتابیس پیش ساخته

در برنامه های واقعی,استفاده از دیتابیس از پیش ساخته شده بسیار مفیدتر خواهد بود.برای مثال قصد نوشتن برنامه ای را دارید که در آن مختصات جغرافیایی اماکن مختلف را ذخیره کرده اید.پس خیلی بهتر است که این بانک را از قبل ایجاد نموده و اطلاعات را درون آن ذخیره کنید.

ابزارهای ریادی برای ایجاد دیتابیس SQLite وجود دارد.می توانید از ابزارهای بسیار مفید و رایگانی که در اینترنت موجود است استفاده کنید.یکی از این ابزارها برنامه ی SQLite Datebase Browser است که به صورت رایگان از وبسایت http://sourceforge.net/projects/sqlitebrowser/ قابل دریافت است.وقتی که برنامه SQLite Database Browser را نصب کردید, می توانید به صورت مصور به طراحی دیتابیس بپردازید.در شکل زیر یک جدول با نام contacts با فیلدهای مخصوص به خود ایجاد شده است.

 ایجاد جدول و ردیف های آن بسیار آسان است.در شکل زیر ملاحظه می فرمائید که چگونه می توان با استفاده از سربرگ Browse Data اطلاعات را وارد جدول کرد.

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

1.با اسفاده از پروژه قبلی که ساختید فایل دیتابیس را هم که در قسمت قبل آماده کردی به فولدر assets پروژه اندرویدتان منتقل کنید:

نکته:توجه داشته باشید که نام تمامی فایل هایی که درون پوشه assets قرار میگیرند باید با حروف کوچک باشند.بنابراین نام MyDB اشتباه است و mydb صحیح است.

 2.فایل MainActivity.java را به صورت زیر تغییر دهید:

 

@Overrid
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
String destPath = “/data/data/” + getPackageName() +
“/databases/MyDB”;
File f = new File(destPath);
if (!f.exists()) {
CopyDB( getBaseContext().getAssets().open(“mydb”),
new FileOutputStream(destPath));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
DBAdapter db = new DBAdapter(this);
//---get all contacts---
db.open();
Cursor c = db.getAllContacts();
if (c.moveToFirst())
{
do {
DisplayContact(c);
} while (c.moveToNext());
}
db.close();
}
public void CopyDB(InputStream inputStream,
OutputStream outputStream)
throws IOException {
//---copy 1K bytes at a time---
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}

3.برنامه را در شبیه ساز اجرا کنید.وقتی برنامه اجرا شد فایل دیتابیس mydb در فولدر data/data/com.PRG.Database/databases/ با نام MyDB ذخیره می شود.

روش کار

ابتدا متد ()CopyDB را برای کپی فایل دیتابیس از محلی به محل دیگر را تعریف می کنیم:

 

public void CopyDB(InputStream inputStream,
OutputStream outputStream)
throws IOException {
//---copy 1K bytes at a time---
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}

به این نکته توجه داشته باشید که در این مثال از شئ InputStream برای خواندن فایل از منبع و سپس از شئ OutputStream برای نوشتن آن در محل مقصد استفاده کردیم.وقتی اکتیویتی ایجاد گردد, فایل دیتابیس که در فولدر assets قرار دارد به فولدر data/data/com.PRG.Databases/databased در دستگاه اندروید کپی می شود.

 

try {
String destPath = “/data/data/” + getPackageName() +
“/databases/MyDB”;
File f = new File(destPath);
if (!f.exists()) {
CopyDB( getBaseContext().getAssets().open(“mydb”),
new FileOutputStream(destPath));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

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

برای اینکه مطمئن شوید که نیازی به کپی فایل است, از حذف فایل دیتابیس در شبیه ساز اطمینان حاصل کنید.می توانید دیتابیس را از طریق DDMS نیز حذف کنید.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehiمجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامیپرداخت آنلاین -  بانک ملتمعرفی بیاموز در شبکه سهپرداخت آنلاین - بانک اقتصاد نوینپرداخت آنلاین - بانک سامان