در این مقاله، به بررسی کامل موضوع کار با دیتا در اندروید با استفاده از Java میپردازیم. این مقاله بهطور خاص برای مبتدیان طراحی شده است و تمامی جنبههای مهم این موضوع از جمله ذخیرهسازی دادهها، استفاده از SQLite، Room Database، SharedPreferences و مدیریت فایلها را پوشش میدهد. همچنین، مثالهای عملی و کدهای مربوطه برای هر بخش آورده شده است تا فهم بهتر و سریعتری از این مفاهیم داشته باشید.اگر به دنبال آموزش Java برای برنامهنویسی اندروید هستید، لازم است تا با مفاهیم مدیریت دادهها در اندروید آشنا شوید. در این مقاله، تمام روشهای رایج ذخیرهسازی و مدیریت دادهها در برنامههای اندرویدی را با استفاده از Java آموزش خواهیم داد.
استفاده از SQLite برای ذخیرهسازی دادهها
SQLite چیست؟
SQLite یک پایگاه داده سبک و بدون سرور است که بهطور گسترده در توسعه برنامههای موبایلی و دسکتاپی استفاده میشود. این پایگاه داده بهصورت یک فایل تکفایلی در دستگاه ذخیره میشود و از این رو، مدیریت دادهها را سادهتر میکند. در اندروید، SQLite بهطور پیشفرض برای ذخیرهسازی دادهها در دستگاه استفاده میشود و نیاز به نصب هیچ سرور یا سرویس خاصی ندارد.
این پایگاه داده معمولاً برای ذخیرهسازی اطلاعاتی مانند تنظیمات کاربری، دادههای اپلیکیشن، اطلاعاتی که نیاز به ذخیرهسازی محلی دارند و یا دادههایی که حجم کمی دارند، استفاده میشود.
ویژگیهای کلیدی SQLite:
سبک و بدون سرور: SQLite هیچ نیازی به راهاندازی یک سرور جداگانه ندارد و دادهها در قالب یک فایل ذخیره میشوند.
پشتیبانی از SQL: SQLite از زبان SQL پشتیبانی میکند، به این معنی که میتوان از دستورات SQL مانند SELECT, INSERT, UPDATE, DELETE برای کار با دادهها استفاده کرد.
عملکرد بالا: بهدلیل اینکه SQLite دادهها را در یک فایل محلی ذخیره میکند، عملکرد بسیار سریعی برای کار با دادههای کمحجم دارد.
قابلیت حمل: چون دادهها در یک فایل ذخیره میشوند، این فایلها به راحتی میتوانند بین دستگاهها جابجا شوند.
نحوه استفاده از SQLite در اندروید
برای استفاده از SQLite در اندروید با استفاده از Java، معمولاً نیاز است که از کلاس SQLiteOpenHelper استفاده کنیم. این کلاس، وظیفه ایجاد، مدیریت و ارتقاء پایگاه داده را بر عهده دارد. شما باید یک کلاس سفارشی از این کلاس بسازید و روشهایی مانند onCreate() و onUpgrade() را پیادهسازی کنید تا فرآیندهای ایجاد و ارتقاء پایگاه داده را مدیریت کنید.
در اینجا نحوه استفاده از SQLite در اندروید را بهطور کامل توضیح میدهیم:
1. ایجاد کلاس SQLiteOpenHelper
ابتدا یک کلاس جدید از SQLiteOpenHelper ایجاد میکنیم که وظیفه ایجاد و مدیریت پایگاه داده را انجام میدهد.
public class DatabaseHelper extends SQLiteOpenHelper {
// نام پایگاه داده
public static final String DATABASE_NAME = "example.db";
// نام جدول
public static final String TABLE_NAME = "users";
// اسامی ستونها
public static final String COL_1 = "ID";
public static final String COL_2 = "NAME";
public static final String COL_3 = "AGE";
// سازنده کلاس که پایگاه داده را ایجاد میکند
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1); // ورژن پایگاه داده را مشخص میکنیم
}
// این متد هنگام ایجاد پایگاه داده فراخوانی میشود
@Override
public void onCreate(SQLiteDatabase db) {
// ایجاد جدول با استفاده از دستورات SQL
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" +
COL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COL_2 + " TEXT, " +
COL_3 + " INTEGER)");
}
// این متد هنگام ارتقاء پایگاه داده فراخوانی میشود
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// اگر نسخه جدید پایگاه داده بالاتر باشد، جدول قبلی حذف و جدید ایجاد میشود
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
// متد برای اضافه کردن داده به جدول
public boolean insertData(String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name); // ذخیره نام
contentValues.put(COL_3, age); // ذخیره سن
long result = db.insert(TABLE_NAME, null, contentValues);
return result != -1; // اگر مقدار برگشتی -1 باشد، داده اضافه نشده است
}
}
توضیحات کد:
DatabaseHelper: این کلاس یک پایگاه داده با نام example.db ایجاد میکند و یک جدول به نام users که شامل سه ستون ID, NAME, و AGE است.
onCreate(): در این متد، دستورات SQL برای ایجاد جدول نوشته میشود. ستون ID بهعنوان کلید اصلی با ویژگی AUTOINCREMENT تعریف شده است تا بهطور خودکار شمارهگذاری شود.
onUpgrade(): زمانی که نسخه پایگاه داده تغییر کند، این متد برای حذف جدول قبلی و ایجاد مجدد آن استفاده میشود.
insertData(): این متد برای اضافه کردن دادهها به جدول users استفاده میشود. دادههای ورودی (نام و سن) بهوسیله کلاس ContentValues در پایگاه داده ذخیره میشوند. این متد برمیگرداند که آیا عملیات با موفقیت انجام شده است یا خیر.
2. استفاده از DatabaseHelper در برنامه
پس از ایجاد کلاس DatabaseHelper، میتوانید آن را در فعالیتها (Activities) یا سایر بخشهای برنامه خود استفاده کنید تا دادهها را مدیریت کنید.
// ایجاد نمونهای از DatabaseHelper
DatabaseHelper db = new DatabaseHelper(context);
// اضافه کردن دادهها
boolean isInserted = db.insertData("John Doe", 28);
if (isInserted) {
Toast.makeText(context, "Data inserted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Error inserting data", Toast.LENGTH_SHORT).show();
}
در این مثال، یک نمونه از کلاس DatabaseHelper ساخته میشود و متد insertData() برای اضافه کردن دادهها به پایگاه داده فراخوانی میشود.
3. عملیات دیگر با SQLite:
در اینجا به برخی از عملیاتهای مهم دیگر در SQLite اشاره میکنیم که معمولاً در برنامههای اندرویدی استفاده میشوند:
خواندن دادهها: برای خواندن دادهها از پایگاه داده، میتوانید از متد query() یا rawQuery() استفاده کنید.
public Cursor getAllData() {
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
}
بروزرسانی دادهها: برای بروزرسانی دادهها از متد update() استفاده میشود.
public boolean updateData(String id, String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name);
contentValues.put(COL_3, age);
db.update(TABLE_NAME, contentValues, "ID = ?", new String[]{id});
return true;
}
حذف دادهها: برای حذف دادهها از متد delete() استفاده میشود.
public Integer deleteData(String id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, "ID = ?", new String[]{id});
}
استفاده از SQLite در اندروید با Java به شما این امکان را میدهد که دادهها را بهطور مؤثر و کارآمد در دستگاه ذخیره کنید. با استفاده از کلاس SQLiteOpenHelper میتوانید پایگاه دادهها را مدیریت کنید و عملیات مختلف مانند ذخیره، خواندن، بروزرسانی و حذف دادهها را انجام دهید.
عملیات CRUD در SQLite
در این بخش، به بررسی چهار عملیات اصلی کار با دیتا در SQLite میپردازیم که شامل Create، Read، Update و Delete میشوند. این عملیاتها برای تعامل با پایگاه داده و مدیریت رکوردها در SQLite در اندروید استفاده میشوند.
1. Create: ایجاد رکورد جدید
برای ایجاد رکورد جدید در پایگاه داده SQLite، از متد insert() استفاده میکنیم. این متد یک یا چند داده را به جدول مورد نظر اضافه میکند. در کد قبلی، ما از متد insertData() استفاده کرده بودیم که با استفاده از آن دادهها به جدول اضافه میشوند.
کد نمونه برای عملیات Create:
public boolean insertData(String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name); // ذخیره نام
contentValues.put(COL_3, age); // ذخیره سن
long result = db.insert(TABLE_NAME, null, contentValues);
return result != -1; // اگر مقدار برگشتی -1 باشد، داده اضافه نشده است
}
در اینجا:
ContentValues برای قرار دادن دادهها در پایگاه داده استفاده میشود.
متد insert() رکورد جدید را به جدول users اضافه میکند.
2. Read: خواندن دادهها
برای خواندن دادهها از پایگاه داده SQLite، میتوان از دو متد query() و rawQuery() استفاده کرد. متد query() از قابلیت فیلتر کردن دادهها با استفاده از شرایط مختلف پشتیبانی میکند، در حالی که rawQuery() به شما اجازه میدهد که مستقیماً دستورات SQL را اجرا کنید.
کد نمونه برای عملیات Read (خواندن دادهها):
public Cursor getAllData() {
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
}
در اینجا:
rawQuery() یک دستور SQL بهصورت رشتهای میپذیرد و آن را اجرا میکند.
Cursor به شما این امکان را میدهد که دادههای برگشتی از پایگاه داده را پیمایش کنید.
استفاده از Cursor برای خواندن نتایج:
Cursor res = getAllData();
if (res != null) {
while (res.moveToNext()) {
String name = res.getString(res.getColumnIndex(COL_2));
int age = res.getInt(res.getColumnIndex(COL_3));
// انجام هر کاری با دادههای خوانده شده
}
}
3. Update: بروزرسانی دادهها
برای بروزرسانی دادههای موجود در پایگاه داده، از متد update() استفاده میکنیم. این متد به شما اجازه میدهد تا رکوردهای خاصی را بر اساس شرایطی که تعریف میکنید، بروزرسانی کنید.
کد نمونه برای عملیات Update:
public boolean updateData(String id, String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name);
contentValues.put(COL_3, age);
// بروزرسانی رکوردهایی که ID مشخصی دارند
int result = db.update(TABLE_NAME, contentValues, "ID = ?", new String[]{id});
return result > 0; // اگر هیچ رکوردی بروزرسانی نشده باشد، نتیجه 0 خواهد بود
}
در اینجا:
ContentValues بهطور مشابه با عملیات Create استفاده میشود تا دادههای جدید را برای بروزرسانی در خود نگهدارد.
update() بر اساس شناسه (ID) رکوردهایی که باید بروزرسانی شوند را پیدا کرده و آنها را تغییر میدهد.
4. Delete: حذف دادهها
برای حذف رکوردها از پایگاه داده، از متد delete() استفاده میکنیم. این متد رکوردهای خاصی را که بر اساس شرایط داده شده شناسایی میشوند، حذف میکند.
کد نمونه برای عملیات Delete:
public Integer deleteData(String id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, "ID = ?", new String[]{id});
}
در اینجا:
متد delete() بر اساس شناسه ID رکوردها را پیدا کرده و حذف میکند.
این متد تعداد رکوردهای حذف شده را برمیگرداند. اگر رکوردی حذف نشود، مقدار برگشتی 0 خواهد بود.
مثال کامل عملیات CRUD:
در اینجا یک مثال کامل از استفاده از عملیات CRUD در SQLite آورده شده است:
public class DatabaseHelper extends SQLiteOpenHelper {
// ستونها و نامهای جداول
public static final String DATABASE_NAME = "example.db";
public static final String TABLE_NAME = "users";
public static final String COL_1 = "ID";
public static final String COL_2 = "NAME";
public static final String COL_3 = "AGE";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
// عملیات Create
public boolean insertData(String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name);
contentValues.put(COL_3, age);
long result = db.insert(TABLE_NAME, null, contentValues);
return result != -1;
}
// عملیات Read
public Cursor getAllData() {
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
}
// عملیات Update
public boolean updateData(String id, String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name);
contentValues.put(COL_3, age);
int result = db.update(TABLE_NAME, contentValues, "ID = ?", new String[]{id});
return result > 0;
}
// عملیات Delete
public Integer deleteData(String id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, "ID = ?", new String[]{id});
}
}
در این کد:
عملیات Create داده جدیدی را به پایگاه داده اضافه میکند.
عملیات Read دادهها را از پایگاه داده میخواند.
عملیات Update دادههای موجود را بر اساس شناسه (ID) بروزرسانی میکند.
عملیات Delete دادهها را بر اساس شناسه (ID) حذف میکند.
عملیات CRUD پایهایترین و پرکاربردترین عملیاتها برای کار با پایگاه دادهها هستند. در این بخش، یاد گرفتید که چگونه میتوان با استفاده از SQLite در اندروید، دادهها را ایجاد، خواندن، بروزرسانی و حذف کرد. این عملیاتها به شما این امکان را میدهند که مدیریت دادههای برنامههای اندرویدی خود را بهطور مؤثر انجام دهید.
استفاده از Room Database برای مدیریت دادهها
Room چیست؟
Room یک لایه انتزاعی بالای پایگاه داده SQLite در اندروید است که برای سادهسازی تعامل با دادهها و پایگاههای داده طراحی شده است. هدف اصلی Room این است که پیچیدگیهای کار با SQLite را کاهش دهد و عملیاتهای پایگاه داده را به صورت امنتر و بهینهتر انجام دهد. با استفاده از Room، شما دیگر نیازی به نوشتن SQL بهصورت دستی ندارید، بلکه میتوانید از ابزارها و امکانات موجود در Room برای انجام عملیاتهای مختلف استفاده کنید.
مزایای استفاده از Room:
کاهش کد نویسی: از آنجا که Room بسیاری از جزئیات پیچیده مانند نوشتن کدهای SQL را مدیریت میکند، کد کمتری نیاز است.
استفاده از انوتیشنها: با استفاده از انوتیشنها (annotations) میتوانید بهراحتی جداول، دادهها و عملیات مختلف را تعریف کنید.
مدیریت بهتر خطاها: Room بهطور خودکار برخی از خطاهای رایج SQL را مدیریت میکند.
پشتیبانی از LiveData و Coroutine: Room از LiveData و Coroutine پشتیبانی میکند که برای ایجاد برنامههایی با واکنشپذیری بالا مفید است.
نحوه استفاده از Room
برای استفاده از Room، ابتدا باید وابستگیهای مربوط به آن را در پروژه خود اضافه کنید. سپس باید چند مرحله ساده را دنبال کنید: تعریف Entity، ایجاد DAO (Data Access Object) و استفاده از Database.
1. اضافه کردن وابستگیها به پروژه
ابتدا باید وابستگیهای Room را به فایل build.gradle پروژه خود اضافه کنید:
dependencies {
implementation "androidx.room:room-runtime:2.5.0"
annotationProcessor "androidx.room:room-compiler:2.5.0" // برای کدهایی که به صورت خودکار تولید میشود
}
همچنین میتوانید از kapt (برای پروژههای Kotlin) بهجای annotationProcessor استفاده کنید.
2. تعریف Entity
در Room، یک Entity نشاندهنده یک جدول در پایگاه داده است. برای ایجاد یک Entity، باید از انوتیشن @Entity استفاده کنید و مشخص کنید که این کلاس چه جدولی را در پایگاه داده نمایش میدهد.
@Entity(tableName = "user_table")
public class User {
@PrimaryKey(autoGenerate = true)
private int id; // شناسه کاربر
private String name; // نام کاربر
private int age; // سن کاربر
// Getter و Setterها برای دسترسی به فیلدها
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
در اینجا:
@Entity(tableName = “user_table”) مشخص میکند که کلاس User یک جدول به نام user_table در پایگاه داده خواهد بود.
@PrimaryKey(autoGenerate = true) برای ایجاد یک شناسه یکتا و خودکار برای هر کاربر استفاده میشود.
3. تعریف DAO (Data Access Object)
DAO یک رابط است که متدهای CRUD (Create, Read, Update, Delete) را برای تعامل با پایگاه داده فراهم میکند. شما با استفاده از انوتیشنهای Room مانند @Insert, @Query, @Update, و @Delete متدهای خود را تعریف میکنید.
@Dao
public interface UserDao {
// متد برای اضافه کردن یک کاربر
@Insert
void insert(User user);
// متد برای خواندن تمامی کاربران
@Query("SELECT * FROM user_table")
List<User> getAllUsers();
// متد برای حذف یک کاربر بر اساس ID
@Delete
void delete(User user);
}
در اینجا:
@Insert متدی است که برای اضافه کردن داده به پایگاه داده استفاده میشود.
@Query(“SELECT * FROM user_table”) یک کوئری SQL ساده برای خواندن تمامی رکوردهای جدول user_table است.
@Delete برای حذف یک رکورد خاص از جدول استفاده میشود.
4. ایجاد پایگاه داده و استفاده از Room
بعد از تعریف Entity و DAO، مرحله بعدی این است که پایگاه داده را ایجاد کنید و از آن برای انجام عملیاتهای CRUD استفاده کنید. برای این کار باید یک کلاس پایگاه داده (AppDatabase) ایجاد کنید و آن را از کلاس RoomDatabase ارثبری کنید.
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao(); // متد برای دسترسی به UserDao
}
در اینجا:
@Database انوتیشنی است که پایگاه داده را تعریف میکند. در اینجا فقط کلاس User بهعنوان Entity برای پایگاه داده استفاده شده است.
abstract بودن متد userDao() برای ایجاد DAO است که در عملیاتهای پایگاه داده استفاده خواهد شد.
5. ساخت و استفاده از پایگاه داده Room
برای استفاده از پایگاه داده، باید آن را با استفاده از Room.databaseBuilder() بسازید. سپس میتوانید به UserDao دسترسی پیدا کنید و عملیاتهای مختلف CRUD را انجام دهید.
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build();
UserDao userDao = db.userDao();
// اضافه کردن یک کاربر جدید
userDao.insert(new User("John", 25));
// خواندن تمامی کاربران
List<User> users = userDao.getAllUsers();
// حذف یک کاربر
User userToDelete = users.get(0);
userDao.delete(userToDelete);
در اینجا:
Room.databaseBuilder(context, AppDatabase.class, “database-name”) پایگاه داده را میسازد.
از userDao برای انجام عملیاتهای CRUD استفاده میشود.
Room یک ابزار قدرتمند و ساده برای کار با پایگاه داده SQLite در اندروید است. با استفاده از انوتیشنها و DAOها، شما میتوانید بهراحتی جداول پایگاه داده خود را تعریف کرده و عملیاتهای CRUD را انجام دهید. Room باعث کاهش کدنویسی، افزایش کارایی، و مدیریت بهتر پایگاه داده در برنامههای اندرویدی میشود و در نهایت تجربه بهتری را برای توسعهدهندگان فراهم میآورد.
ذخیره دادهها با استفاده از SharedPreferences
SharedPreferences چیست؟
SharedPreferences یکی از روشهای ساده و سریع برای ذخیرهسازی دادههای کلید-مقدار در اندروید است. این تکنیک معمولاً برای ذخیرهسازی دادههای کوچک و ساده مانند تنظیمات کاربر، ترجیحات، وضعیت برنامه یا مقادیر پراکنده استفاده میشود.
دادههایی که با SharedPreferences ذخیره میشوند، بهطور معمول نیاز به مدیریت پیچیدهتری ندارند و معمولاً شامل اطلاعاتی هستند که برای مدت طولانی تغییر نمیکنند، مانند نام کاربری، وضعیت لاگین، یا ترجیحات نمایش.
ویژگیهای SharedPreferences:
سبک و سریع: برای ذخیرهسازی دادههای ساده و کوچک بسیار کارآمد است.
دادهها بهصورت کلید-مقدار ذخیره میشوند: هر داده با یک کلید یکتا ذخیره میشود.
بدون نیاز به پایگاه داده: نیازی به استفاده از پایگاه داده SQLite یا Room برای ذخیرهسازی دادههای ساده ندارید.
مناسب برای تنظیمات و ترجیحات کاربر: مانند حالت شب و روز، تنظیمات اعلانها و غیره.
نحوه استفاده از SharedPreferences
برای استفاده از SharedPreferences، ابتدا باید یک SharedPreferences ایجاد کنید که به آن دسترسی داشته باشید. سپس میتوانید دادهها را با استفاده از متدهای مختلف مانند putString(), putInt(), putBoolean() ذخیره کنید و از آنها بخوانید.
1. ایجاد SharedPreferences
برای ایجاد و دسترسی به یک SharedPreferences، از متد getSharedPreferences() استفاده میشود. این متد دو پارامتر میپذیرد: نام SharedPreferences و حالت دسترسی. در اینجا بهطور معمول از Context.MODE_PRIVATE برای حالت دسترسی استفاده میشود که به این معنی است که فایل SharedPreferences فقط توسط برنامه خودتان قابل دسترسی است.
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
در اینجا:
“MyPrefs” نام فایل SharedPreferences است. شما میتوانید این نام را مطابق نیاز خود تغییر دهید.
Context.MODE_PRIVATE به این معناست که تنها برنامه خود شما میتواند به دادهها دسترسی داشته باشد.
2. ویرایش و ذخیره دادهها
برای ویرایش دادهها و ذخیرهسازی آنها در SharedPreferences، باید از SharedPreferences.Editor استفاده کنید. این شیء برای تغییر دادهها و ذخیره کردن آنها در SharedPreferences بهکار میرود.
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("username", "John"); // ذخیره نام کاربری
editor.putInt("age", 30); // ذخیره سن کاربر
editor.putBoolean("isLoggedIn", true); // ذخیره وضعیت ورود کاربر
editor.apply(); // ذخیره تغییرات
در اینجا:
putString(“username”, “John”): دادهای از نوع String به SharedPreferences ذخیره میکند.
putInt(“age”, 30): دادهای از نوع Integer ذخیره میکند.
putBoolean(“isLoggedIn”, true): دادهای از نوع Boolean ذخیره میکند.
apply(): تغییرات را ذخیره میکند و دادهها بهطور دائم در فایل SharedPreferences نوشته میشود.
نکته: بهجای apply(), میتوانید از commit() نیز استفاده کنید که مانند apply() عمل میکند، اما مزیت apply() این است که غیرهمزمان است، یعنی فوراً ذخیرهسازی انجام نمیشود، بلکه در پسزمینه انجام میشود و عملکرد برنامه را تحت تأثیر قرار نمیدهد.
3. خواندن دادهها از SharedPreferences
برای خواندن دادهها از SharedPreferences، میتوانید از متدهای getString(), getInt(), getBoolean() و دیگر متدهای مشابه استفاده کنید. این متدها مقادیر ذخیرهشده را بر اساس کلیدهای دادهشده بازیابی میکنند.
String username = sharedPref.getString("username", "default_name");
int age = sharedPref.getInt("age", 0);
boolean isLoggedIn = sharedPref.getBoolean("isLoggedIn", false);
در اینجا:
getString(“username”, “default_name”): نام کاربری را از SharedPreferences میخواند. اگر کلید “username” وجود نداشته باشد، مقدار پیشفرض “default_name” بازگردانده میشود.
getInt(“age”, 0): سن کاربر را میخواند. اگر کلید “age” وجود نداشته باشد، مقدار پیشفرض 0 بازگردانده میشود.
getBoolean(“isLoggedIn”, false): وضعیت ورود کاربر را میخواند. اگر کلید “isLoggedIn” وجود نداشته باشد، مقدار پیشفرض false برگشت داده میشود.
4. حذف دادهها از SharedPreferences
برای حذف یک داده خاص از SharedPreferences، میتوانید از متد remove() استفاده کنید. این متد دادهای را که با کلید خاص ذخیره شده است حذف میکند.
SharedPreferences.Editor editor = sharedPref.edit();
editor.remove("username"); // حذف داده با کلید "username"
editor.apply();
5. حذف تمامی دادهها از SharedPreferences
اگر بخواهید تمامی دادههای ذخیرهشده در SharedPreferences را حذف کنید، میتوانید از متد clear() استفاده کنید:
SharedPreferences.Editor editor = sharedPref.edit(); editor.clear(); // حذف تمامی دادهها editor.apply();
نکات اضافی در استفاده از SharedPreferences:
دادهها بهصورت امن ذخیره نمیشوند: SharedPreferences بهطور پیشفرض دادهها را بهصورت متنی ذخیره میکند. بنابراین، از آن برای ذخیرهسازی دادههای حساس مانند پسوردها استفاده نکنید. برای این کار بهتر است از EncryptedSharedPreferences استفاده کنید.
پشتیبانی از LiveData: در برخی موارد میتوانید از LiveData برای ذخیره دادهها و دریافت تغییرات بهصورت زنده در هنگام تغییر دادهها استفاده کنید.
SharedPreferences یک ابزار بسیار مفید و ساده برای ذخیرهسازی دادههای کلید-مقدار در اندروید است که برای ذخیره تنظیمات، ترجیحات کاربر، و مقادیر پراکنده استفاده میشود. این روش سرعت بالا و کدنویسی کم را فراهم میکند و برای دادههای ساده بسیار مناسب است. استفاده از SharedPreferences میتواند به شما کمک کند تا تجربهای راحت و سریع برای ذخیرهسازی تنظیمات و اطلاعات ساده در اپلیکیشنهای اندرویدی خود داشته باشید.
مدیریت فایلها و دایرکتوریها در دستگاه
کار با فایلها در اندروید
در اندروید، برای ذخیرهسازی دادهها در فایلها و دسترسی به آنها، میتوانید از کلاسهای مختلفی مانند File, FileOutputStream, FileInputStream, و غیره استفاده کنید. این کلاسها به شما امکان میدهند تا فایلها را در دستگاه ذخیره کرده، آنها را بخوانید یا ویرایش کنید. مدیریت فایلها در اندروید معمولاً به دو دسته تقسیم میشود:
فایلهای داخلی (Internal Storage): فایلهایی که در حافظه داخلی دستگاه ذخیره میشوند و فقط توسط برنامه خود شما قابل دسترسی هستند.
فایلهای خارجی (External Storage): فایلهایی که در حافظه خارجی یا کارت SD ذخیره میشوند و معمولاً توسط چندین برنامه قابل دسترسی هستند.
در این بخش، ما بیشتر به کار با فایلها در حافظه داخلی خواهیم پرداخت، زیرا این روش از نظر امنیتی ایمنتر است و برای ذخیره دادههای موقتی یا خصوصی ترجیح داده میشود.
نحوه استفاده از کلاسهای فایل
برای کار با فایلها در اندروید، ابتدا باید با استفاده از کلاس FileOutputStream فایلهای جدید بسازید یا دادهها را به فایلهای موجود بنویسید. پس از آن، میتوانید از کلاس FileInputStream برای خواندن دادهها از فایل استفاده کنید.
1. نوشتن دادهها به یک فایل داخلی
برای نوشتن دادهها به یک فایل، از متد openFileOutput() استفاده میشود. این متد یک فایل جدید ایجاد میکند یا اگر فایلی با همان نام وجود داشته باشد، دادههای جدید به آن اضافه میکند.
FileOutputStream fos = openFileOutput("example.txt", Context.MODE_PRIVATE);
fos.write("Hello, Android!".getBytes());
fos.close();
در اینجا:
openFileOutput(“example.txt”, Context.MODE_PRIVATE) فایل example.txt را در حافظه داخلی باز میکند یا اگر موجود نباشد، آن را ایجاد میکند. Context.MODE_PRIVATE به این معناست که این فایل فقط برای برنامه شما قابل دسترسی خواهد بود.
fos.write(“Hello, Android!”.getBytes()): دادهای از نوع رشته به فایل نوشته میشود. برای نوشتن دادهها به صورت بایت (byte) باید از متد getBytes() استفاده کنید.
fos.close(): برای بستن فایل و اطمینان از ذخیرهسازی صحیح دادهها این متد فراخوانی میشود.
2. خواندن دادهها از یک فایل داخلی
برای خواندن دادهها از فایل، از کلاس FileInputStream استفاده میشود. این کلاس به شما اجازه میدهد تا دادهها را از فایل بازخوانی کرده و آنها را در برنامه خود استفاده کنید.
FileInputStream fis = openFileInput("example.txt");
int character;
StringBuilder stringBuilder = new StringBuilder();
while ((character = fis.read()) != -1) {
stringBuilder.append((char) character);
}
fis.close();
String content = stringBuilder.toString();
در اینجا:
openFileInput(“example.txt”) فایل example.txt را در حافظه داخلی باز میکند.
fis.read() بهصورت پیوسته هر بایت از فایل را میخواند تا به انتهای فایل برسد.
stringBuilder.append((char) character) برای تبدیل هر بایت خوانده شده به یک کاراکتر و افزودن آن به رشته استفاده میشود.
fis.close() برای بستن فایل پس از اتمام خواندن فراخوانی میشود.
3. کار با دایرکتوریها در اندروید
برای مدیریت دایرکتوریها و فایلها در اندروید، میتوانید از کلاس File استفاده کنید. این کلاس امکانات مختلفی برای کار با فایلها و دایرکتوریها فراهم میکند، مانند بررسی وجود یک فایل یا دایرکتوری، ایجاد دایرکتوری جدید، و حذف فایلها.
بررسی وجود یک دایرکتوری یا فایل: برای بررسی وجود یک فایل یا دایرکتوری، از متد exists() استفاده میشود.
File directory = new File(context.getFilesDir(), "myFolder");
if (!directory.exists()) {
directory.mkdir(); // ساخت دایرکتوری جدید اگر وجود نداشته باشد
}
در اینجا:
context.getFilesDir() دایرکتوری داخلی برنامه را باز میکند که در آن فایلها ذخیره میشوند.
directory.mkdir() دایرکتوری جدید به نام “myFolder” ایجاد میکند.
حذف یک فایل یا دایرکتوری: برای حذف یک فایل یا دایرکتوری از متد delete() استفاده میشود.
File file = new File(context.getFilesDir(), "example.txt");
if (file.exists()) {
file.delete(); // حذف فایل
}
لیست فایلها و دایرکتوریها: برای دریافت لیستی از فایلها و دایرکتوریها در یک دایرکتوری خاص، از متد listFiles() استفاده میشود.
File directory = new File(context.getFilesDir(), "myFolder");
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
Log.d("File", file.getName()); // نمایش نام فایلها
}
}
تفاوت کار با فایلهای داخلی و خارجی
در اندروید، فایلهای ذخیره شده در حافظه داخلی تنها برای برنامه خود شما قابل دسترسی هستند و دیگر برنامهها نمیتوانند به آنها دسترسی پیدا کنند. این فایلها در هنگام حذف برنامه پاک میشوند. اما فایلهای ذخیره شده در حافظه خارجی یا کارت SD میتوانند توسط دیگر برنامهها نیز خوانده شوند.
برای دسترسی به حافظه خارجی، باید مجوزهای خاصی را در فایل AndroidManifest.xml درخواست کنید، مانند:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
در نسخههای جدید اندروید (از Android 6.0 به بعد)، باید از دسترسیهای زمان اجرا نیز برای خواندن و نوشتن در حافظه خارجی درخواست مجوز کنید.
مدیریت فایلها و دایرکتوریها در اندروید با استفاده از کلاسهای File, FileOutputStream, و FileInputStream به شما این امکان را میدهد که دادهها را به صورت محلی در دستگاه ذخیره کرده و از آنها استفاده کنید. با استفاده از این کلاسها میتوانید دادههای متنی، باینری و دیگر انواع دادهها را در فایلها ذخیره کرده و آنها را بخوانید. همچنین، با مدیریت دایرکتوریها و فایلها، میتوانید ساختار مناسبی برای ذخیرهسازی دادهها در اپلیکیشنهای اندرویدی خود ایجاد کنید.
نتیجهگیری
در این مقاله، بهطور جامع به موضوع “کار با دیتا در اندروید با استفاده از Java” پرداختیم و روشهای مختلفی را برای ذخیرهسازی و مدیریت دادهها در اندروید بررسی کردیم. از استفاده از SQLite برای پایگاههای داده داخلی و اجرای عملیات CRUD تا Room Database که فرآیند کار با دیتابیس را سادهتر و امنتر میکند، تا روشهای ذخیرهسازی دادههای ساده با SharedPreferences و نحوه مدیریت فایلها و دایرکتوریها در دستگاههای اندرویدی، همگی ابزارهایی هستند که به شما در مدیریت دادهها و ذخیرهسازی آنها کمک میکنند.
همچنین در این مقاله توضیح دادیم که در شرایط مختلف چه روشی برای ذخیرهسازی دادهها بهترین گزینه است؛ برای مثال، اگر نیاز به ذخیرهسازی دادههای پیچیده و حجیم دارید، SQLite یا Room بهترین گزینهها هستند، اما اگر قصد دارید تنظیمات و ترجیحات سادهای را ذخیره کنید، SharedPreferences روش سریع و سادهای است. علاوه بر این، مدیریت فایلها و دایرکتوریها در حافظه داخلی و خارجی به شما این امکان را میدهد که دادهها را در دستگاه ذخیره کنید و بهراحتی به آنها دسترسی داشته باشید.
در نهایت، کار با دیتا در اندروید با استفاده از Java یکی از مهارتهای اساسی برای توسعهدهندگان اندروید است که میتواند به شما کمک کند تا برنامههای کاربردی خود را با قابلیت ذخیرهسازی دادههای مختلف و مدیریت آنها توسعه دهید. این مقاله شما را در مسیر یادگیری و تسلط بر این مهارت هدایت میکند.
برای یادگیری بیشتر و گسترش دانش خود در زمینه کار با دیتا در اندروید با استفاده از Java، میتوانید منابع زیر را مطالعه کنید و با تمرین بیشتر، مهارتهای خود را به سطح پیشرفتهتری ارتقا دهید.
