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

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


咨詢
建站咨詢
