新聞中心
在Android開發(fā)中,經(jīng)常需要對本地數(shù)據(jù)庫進行一些定時操作,例如清理過期數(shù)據(jù)、定時備份等。那么,該如何在Android上進行數(shù)據(jù)庫的定時操作呢?本文將為大家介紹如何使用AlarmManager實現(xiàn)Android上的定時數(shù)據(jù)庫操作。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),焉耆企業(yè)網(wǎng)站建設(shè),焉耆品牌網(wǎng)站建設(shè),網(wǎng)站定制,焉耆網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,焉耆網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
一、前置知識
在開始之前,需要了解以下幾個知識點:
1. SQLite數(shù)據(jù)庫:Android中自帶的輕量級數(shù)據(jù)庫,可用于本地存儲、增刪改查等操作。
2. AlarmManager:AAndroid系統(tǒng)提供的一種機制,可用于實現(xiàn)定時任務(wù)的管理。
3. BroadcastReceiver:一種特殊類型的組件,用于接收系統(tǒng)或應(yīng)用程序發(fā)送的廣播消息。
4. Service:一種無界面的組件,用于在后臺執(zhí)行長時間運行的任務(wù)。
二、實現(xiàn)步驟
在Android上實現(xiàn)數(shù)據(jù)庫的定時操作,通常分為以下幾個步驟:
1. 創(chuàng)建SQLite數(shù)據(jù)庫
需要創(chuàng)建一個SQLite數(shù)據(jù)庫,并在其表中插入一些數(shù)據(jù),以便后續(xù)操作。這里不做過多講解。
2. 創(chuàng)建廣播接收器
接下來,創(chuàng)建一個廣播接收器(BroadcastReceiver),用于接收系統(tǒng)的定時廣播消息。在接收到廣播消息后,該接收器會啟動一個Service進行后臺任務(wù)的處理。
“`java
public class TimerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, DatabaseService.class);
context.startService(serviceIntent);
}
}
“`
3. 創(chuàng)建Service
接著,創(chuàng)建一個Service,用于在后臺執(zhí)行數(shù)據(jù)庫的定時處理任務(wù)(如清理過期數(shù)據(jù)、備份等)。在該Service的onStartCommand方法中,進行數(shù)據(jù)庫的相關(guān)操作。
“`java
public class DatabaseService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 數(shù)據(jù)庫處理操作
return START_NOT_STICKY;
}
}
“`
注意,在Service中進行耗時操作時,需要在子線程中執(zhí)行,以避免主線程的阻塞。
4. 設(shè)置定時任務(wù)
使用AlarmManager設(shè)置定時任務(wù),在指定的時間間隔內(nèi)發(fā)送廣播消息,以觸發(fā)數(shù)據(jù)庫處理任務(wù)的啟動。
“`java
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, TimerReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
long interval = 24 * 60 * 60 * 1000;// 每隔24小時發(fā)送廣播
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pi);
“`
在以上代碼中,AlarmManager的setRepeating方法中需要傳入以下參數(shù):
– type:定時任務(wù)的類型,有RTC和ELAPSED_REALTIME兩種。
– triggerAtMillis:定時任務(wù)觸發(fā)的時間點。
– intervalMillis:定時任務(wù)觸發(fā)的時間間隔(毫秒)。
– operation:要執(zhí)行的操作。
設(shè)置好定時任務(wù)后,App會在每隔指定時間間隔內(nèi)執(zhí)行相應(yīng)任務(wù)。
三、注意事項
在使用AlarmManager實現(xiàn)Android上的定時數(shù)據(jù)庫操作時,需要注意以下幾個問題:
1. 權(quán)限問題:需要在AndroidManifest.xml文件中添加接收定時廣播的權(quán)限。
“`xml
“`
2. Service的生命周期問題:在服務(wù)完成任務(wù)后,需要調(diào)用stopSelf()方法或stopService()方法關(guān)閉服務(wù)。
3. 可能的內(nèi)存泄漏問題:使用AlarmManager時,需要注意是否存在內(nèi)存泄漏問題,如未及時清空對象等。
四、
使用AlarmManager實現(xiàn)Android上的定時數(shù)據(jù)庫操作,可以很好地實現(xiàn)本地數(shù)據(jù)庫的定時清理等操作。關(guān)鍵在于正確運用AlarmManager、BroadcastReceiver和Service之間的關(guān)系,以及避免常見的問題和內(nèi)存泄漏。同時,還需要注意權(quán)限的設(shè)置和Service的生命周期等問題。希望這篇文章可以為大家提供一些參考和幫助。
相關(guān)問題拓展閱讀:
- 安卓開發(fā):Android創(chuàng)建和使用數(shù)據(jù)庫詳細指南
- android開發(fā) 數(shù)據(jù)庫的使用
- Android怎么連接服務(wù)器操作數(shù)據(jù)庫
安卓開發(fā):Android創(chuàng)建和使用數(shù)據(jù)庫詳細指南
數(shù)據(jù)庫支持每個應(yīng)用程序無論大小的生命線,除非你的應(yīng)用程序只處理簡單的數(shù)據(jù),那么就需要一個數(shù)據(jù)庫系統(tǒng)存儲你的結(jié)構(gòu)化數(shù)據(jù),Android使用SQLite數(shù)據(jù)庫,它是一個開源的、支持攜蔽銷多操作系統(tǒng)的SQL數(shù)據(jù)庫,在許多領(lǐng)域廣泛使用,如Mozilla FireFox就是使用SQLite來存辯游儲配置數(shù)據(jù)的,iPhone也是使用SQLite來存儲數(shù)據(jù)的。
在Android中,你為某個應(yīng)用程序創(chuàng)建的數(shù)據(jù)庫,只有它可以訪問,其它應(yīng)用程序是不能訪問的,數(shù)據(jù)庫位于Android設(shè)備/data/data/ /databases文件夾中,在這篇文章中,你將會學(xué)習(xí)到如何在Android中創(chuàng)建和使用數(shù)據(jù)庫。
SQLite數(shù)據(jù)庫
使用Eclipse創(chuàng)建一個Android項目,取名為Database,如圖1所示:
創(chuàng)建DBAdapter輔助類
操作數(shù)據(jù)庫的更佳實踐是創(chuàng)建一個輔助類,由它封裝所有對數(shù)據(jù)庫的復(fù)雜訪問,對于調(diào)用代碼而言它是透明的,因此我并逗創(chuàng)建了一個DBAdapter的輔助類,由它創(chuàng)建、打開、關(guān)閉和使用SQLite數(shù)據(jù)庫。
首先,在src/
文件夾(在這個例子中是src/net.learn2develop.Database)下添加一個DBAdapter.java文件。
在DBAdapter.java文件中,導(dǎo)入所有你要使用到的命名空間:
package net.learn2develop.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
{
}
接下來創(chuàng)建一個數(shù)據(jù)庫,取名為bookstitles,字段如圖2所示。
在DBAdapter.java文件中,定義清單1中的常量。
清單1 定義DBAdapter.java文件中的常量
package net.learn2develop.Database;
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_ISBN = in;
public static final String KEY_TITLE = title;
public static final String KEY_PUBLISHER = publisher;
private static final String TAG = DBAdapter;
private static final String DATABASE_NAME = books;
private static final String DATABASE_TABLE = titles;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
create table titles (_id integer primary key autoincrement,
+ in text not null, title text not null,
+ publisher text not null);;
private final Context context;
}
DATABASE_CREATE常量包括創(chuàng)建titles表的SQL語句。
在DBAdapter類中,你可以擴展SQLiteOpenHelper類,它是一個Android輔助類,主要用于數(shù)據(jù)庫創(chuàng)建和版本管理。實際上,你可以覆蓋onCreate()和onUpgrade()方法,如清單2所示。
清單2 在DBAdapter類中,擴展SQLiteOpenHelper類覆蓋onCreate() 和 onUpgrade()方法
package net.learn2develop.Database;
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_ISBN = in;
public static final String KEY_TITLE = title;
public static final String KEY_PUBLISHER = publisher;
private static final String TAG = DBAdapter;
private static final String DATABASE_NAME = books;
private static final String DATABASE_TABLE = titles;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
create table titles (_id integer primary key autoincrement,
+ in text not null, title text not null,
+ publisher 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)
{
db.execSQL(DATABASE_CREATE);
}
@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 titles”);
onCreate(db);
}
}
}
onCreate()方法創(chuàng)建一個新的數(shù)據(jù)庫,onUpgrade()方法用于升級數(shù)據(jù)庫,這可以通過檢查DATABASE_VERSION常量定義的值來實現(xiàn),對于onUpgrade()方法而言,只不過是簡單地刪除表,然后在創(chuàng)建表而已。
#p#副標題#e#
現(xiàn)在你可以定義不同的方法來打開和關(guān)閉數(shù)據(jù)庫,如清單3中的添加/編輯/刪除/行的函數(shù)。
清單3 定義打開和關(guān)閉數(shù)據(jù)庫以及增加/編輯/刪除表中行的方法
public class DBAdapter
{
//…
//…
//—打開數(shù)據(jù)庫—
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//—關(guān)閉數(shù)據(jù)庫—
public void close()
{
DBHelper.close();
}
//—向數(shù)據(jù)庫插入一個標題—
public long insertTitle(String in, String title, String publisher)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ISBN, in);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_PUBLISHER, publisher);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//—刪除一個指定的標題—
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + = + rowId, null)
0;
}
//—檢索所有標題—
public Cursor getAllTitles()
{
return db.query(DATABASE_TABLE, new String {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER},
null,
null,
null,
null,
null);
}
//—檢索一個指定的標題—
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER
},
KEY_ROWID + = + rowId,
null,
null,
null,
null,
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//—更新一個標題—
public boolean updateTitle(long rowId, String in,
String title, String publisher)
{
ContentValues args = new ContentValues();
args.put(KEY_ISBN, in);
args.put(KEY_TITLE, title);
args.put(KEY_PUBLISHER, publisher);
return db.update(DATABASE_TABLE, args,
KEY_ROWID + = + rowId, null)
0;
}
}Database;
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_ISBN = in;
public static final String KEY_TITLE = title;
public static final String KEY_PUBLISHER = publisher;
private static final String TAG = DBAdapter;
private static final String DATABASE_NAME = books;
private static final String DATABASE_TABLE = titles;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
create table titles (_id integer primary key autoincrement,
+ in text not null, title text not null,
+ publisher 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)
{
db.execSQL(DATABASE_CREATE);
}
@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 titles”);
onCreate(db);
}
}
//—打開數(shù)據(jù)庫—
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//—關(guān)閉數(shù)據(jù)庫—
public void close()
{
DBHelper.close();
}
//—向數(shù)據(jù)庫中插入一個標題—
public long insertTitle(String in, String title, String publisher)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ISBN, in);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_PUBLISHER, publisher);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//—刪除一個指定標題—
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID +
= + rowId, null)
0;
}
//—檢索所有標題—
public Cursor getAllTitles()
{
return db.query(DATABASE_TABLE, new String {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER},
null,
null,
null,
null,
null);
}
//—檢索一個指定標題—
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_PUBLISHER
},
KEY_ROWID + = + rowId,
null,
null,
null,
null,
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//—更新一個標題—
public boolean updateTitle(long rowId, String in,
String title, String publisher)
{
ContentValues args = new ContentValues();
args.put(KEY_ISBN, in);
args.put(KEY_TITLE, title);
args.put(KEY_PUBLISHER, publisher);
return db.update(DATABASE_TABLE, args,
KEY_ROWID + = + rowId, null)
0;
}
}
注意Android使用Cursor類返回一個需要的值,Cursor作為一個指針從數(shù)據(jù)庫查詢返回結(jié)果集,使用Cursor允許Android更有效地管理它們需要的行和列,你使用ContentValues對象存儲鍵/值對,它的put()方法允許你插入不同數(shù)據(jù)類型的鍵值。
清單4顯示了完整的DBAdapter.java源代碼。
清單4 DBAdapter.java完整源代碼
package net.learn2develop.
#p#副標題#e#
android開發(fā) 數(shù)據(jù)庫的使用
SQLite是輕量級嵌入式數(shù)據(jù)庫引擎,它支持 SQL 語言,并且只利用很少的內(nèi)存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLite,SQLite 由以下幾個組件組成:SQL 編譯器、內(nèi)核、后端以及附件。SQLite 通過利用虛擬機和虛擬數(shù)據(jù)庫引擎(VDBE),使調(diào)試、修改和擴展 SQLite 的內(nèi)核變得更加方便。
特點:
面向資源有限的設(shè)備, 沒有服務(wù)器進程, 所有數(shù)據(jù)存放在同一文件中跨平臺,可自由復(fù)制。
SQLite 基本上符合 SQL-92 標準,和其他的主要 SQL 數(shù)據(jù)庫沒什么區(qū)別。它的優(yōu)點就是高效,Android 運行時環(huán)境包含了完整的 SQLite。
SQLite 和其他數(shù)據(jù)庫更大的不同就是對數(shù)據(jù)類型的支持,創(chuàng)建一個表時,可以在 CREATE TABLE 語句中指定某列的數(shù)據(jù)類型,但是你可以把任何數(shù)據(jù)類型放入任慶褲燃何列中。當某個值插入數(shù)據(jù)庫時,SQLite 將檢查它的類型。如果該類型與關(guān)聯(lián)的列不匹配,則 SQLite 會嘗試將該值轉(zhuǎn)換成該列的類型。如果不能轉(zhuǎn)換,則該值將作為其本身具有的類型存儲。比如可以把一個字符串(String)放入 INTEGER 列。SQLite 稱這為“弱類型”(manifest typing.)。 此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能純空外,SQLite 是一個完整的 SQL 系統(tǒng),擁有譽虛完整的觸發(fā)器,交易等等。
Android 集成了 SQLite 數(shù)據(jù)庫 Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應(yīng)用程序都可以使用 SQLite 數(shù)據(jù)庫。
對于熟悉 SQL 的開發(fā)人員來時,在 Android 開發(fā)中使用 SQLite 相當簡單。但是,由于 JDBC 會消耗太多的系統(tǒng)資源,所以 JDBC 對于手機這種內(nèi)存受限設(shè)備來說并不合適。因此,Android 提供了一些新的 API 來使用 SQLite 數(shù)據(jù)庫,Android 開發(fā)中,程序員需要學(xué)使用這些 API。
數(shù)據(jù)庫存儲在 data//databases/ 下。 Android 開發(fā)中使用 SQLite 數(shù)據(jù)庫 Activites 可以通過 Content Provider 或者 Service 訪問一個數(shù)據(jù)庫。
下面會詳細講解如果創(chuàng)建數(shù)據(jù)庫,添加數(shù)據(jù)和查詢數(shù)據(jù)庫。 創(chuàng)建數(shù)據(jù)庫 Android 不自動提供數(shù)據(jù)庫。在 Android 應(yīng)用程序中使用 SQLite,必須自己創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表、索引,填充數(shù)據(jù)。
Android 提供了 SQLiteOpenHelper 幫助你創(chuàng)建一個數(shù)據(jù)庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創(chuàng)建數(shù)據(jù)庫。SQLiteOpenHelper 類根據(jù)開發(fā)應(yīng)用程序的需要,封裝了創(chuàng)建和更新數(shù)據(jù)庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現(xiàn)三個方法:
1 構(gòu)造函數(shù),調(diào)用父類 SQLiteOpenHelper 的構(gòu)造函數(shù)。這個方法需要四個參數(shù):上下文環(huán)境(例如,一個 Activity),數(shù)據(jù)庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的數(shù)據(jù)庫模型版本的整數(shù)。
2 onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數(shù),根據(jù)需要對這個對象填充表和初始化數(shù)據(jù)。
3 onUpgrage() 方法,它需要三個參數(shù),一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個數(shù)據(jù)庫從舊的模型轉(zhuǎn)變到新的模型。
Android怎么連接服務(wù)器操作數(shù)據(jù)庫
連接數(shù)據(jù)庫是后臺的事情,android前段開發(fā)只需要接口就可以
關(guān)于android定時操作數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
本文題目:Android上如何進行數(shù)據(jù)庫定時操作(android定時操作數(shù)據(jù)庫)
URL標題:http://fisionsoft.com.cn/article/djecdje.html


咨詢
建站咨詢
