當前位置:首頁 » 安卓系統 » android媒體資料庫

android媒體資料庫

發布時間: 2022-10-29 03:02:42

1. Android如何通過content provider構建媒體文件資料庫麻煩告訴我

MediaProvider實現了 ContentProvider類的幾個操作sql的重要方法如insert ,delete, updata, query。MediaProvider中DatabaseHelper類用於獲取與創建Database。private static final class DatabaseHelper extends SQLiteOpenHelper {final Context mContext;final boolean mInternal; // True if this is the internal database// In memory caches of artist and album data.HashMap< String, Long> mArtistCache = new HashMap< String, Long>();HashMap< String, Long> mAlbumCache = new HashMap< String, Long>();public DatabaseHelper(Context context, String name, boolean internal) {super(context, name, null, DATABASE_VERSION);mContext = context;mInternal = internal;}/*** Creates database the first time we try to open it.*/@Override //第一次打開資料庫時創建Tablepublic void onCreate(final SQLiteDatabase db) {updateDatabase(db, mInternal, 0, DATABASE_VERSION);}以Camera的image文件文件為例,資料庫在第一次使用的時候被創建,對於image文件,SQL在updateDatabase為其創建一個table:db.execSQL("CREATE TABLE IF NOT EXISTS images (" +"_id INTEGER PRIMARY KEY," + //文件保存的序號"_data TEXT," + //記錄image 文件保存路徑"_size INTEGER," + //文件大小"_display_name TEXT," + //圖片名稱"mime_type TEXT," + //文件類型"title TEXT," +"date_added INTEGER," +"date_modified INTEGER," +"description TEXT," +"picasa_id TEXT," +"isprivate INTEGER," +"latitude DOUBLE," +"longitude DOUBLE," +"datetaken INTEGER," +"orientation INTEGER," +"mini_thumb_magic INTEGER," +"bucket_id TEXT," +"bucket_display_name TEXT" +");");添加URI到match這個也很重要,因為不同類型的文件會保存在不同的table中,如果我們得到一個URI為: content://media/external/images/media/1 通過UriMatcher.match(uri)將返回注冊的IMAGES_MEDIA_ID值。URI_MATCHER.addURI("media", "*/images/media", IMAGES_MEDIA);URI_MATCHER.addURI("media", "*/images/media/#", IMAGES_MEDIA_ID);URI格式解析如下:URI格式中最重要的欄位是authority,authority確定了操作資料庫的Provider是由誰提供的。MediaProvider在AndroidManifest.xml中添加如下語句:< provider android:name="MediaProvider" android:authorities="media"android:multiprocess="false" />Provider載入MediaProvider安裝在手機中,ContentResolver通過acquireProvider請求載入Provider程序。acquireProvider正是通過解析URI中的authority欄位,在安裝的package中查找與此authority相符的Provider,如果此Provider沒有被載入ActivityMangerService將載入Provider程序,這個過程可以參考我以前寫的Activity是如何載入的文章。 Provider到底是載入到調用Provider的應用程序還是將Provider程序載入到ActivityManagerService中作為 system Provider這個我不太確定是如何區分的,反正這兩種方式都是可行的,總之按照sdk help 文檔上的方式創建Provider程序,android會自動載入的。記錄的保存與獲取當Camera拍照完成或者是media play文件需要保存的時候,首先要構造保存的數據結構ContentValues values = new ContentValues(7);values.put(Images.Media.TITLE, imageName);values.put(Images.Media.DISPLAY_NAME, imageName);values.put(Images.Media.DESCRIPTION, description);values.put(Images.Media.DATE_TAKEN, dateTaken);values.put(Images.Media.MIME_TYPE, "image/jpeg");values.put(Images.Media.ORIENTATION, orientation);Uri uri = cr.insert(sStorageURI, values); //保存到資料庫sStorageURI == content://media/external/sdcard/media/Authority是 media所以將調用MediaProvider::insert,在insert中生成文件保存的路徑並放在key為_data項數據區。再通過 ContentResolver訪問MediaProvider調用openFile打開文件並將Image或media數據寫入。Camera,Image gallery應用啟動後不會掃描文件系統而是根據資料庫的記錄來進行列表並顯示。這樣做無疑效率比較高。文件的刪除資料庫中保存有文件的路徑名,當調用delete從資料庫中刪除一個記錄後,記錄中_data保存的文件名(絕對路徑)所指的文件也被刪除了。而在應用程序中是找不到刪除文件的代碼,這個困擾了我兩天,在程序中加log,分析源代碼,最終屏蔽MediaProvider中的一段代碼找到了一點線索:public int delete(Uri uri, String userWhere, String[] whereArgs) {int count;int match = URI_MATCHER.match(uri);……………………………..if (match != VOLUMES_ID) {DatabaseHelper database = getDatabaseForUri(uri);if (database == null) {throw new UnsupportedOperationException("Unknown URI: " + uri);}SQLiteDatabase db = database.getWritableDatabase();synchronized (sGetTableAndWhereParam) {getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam);switch (match) {case AUDIO_MEDIA:case AUDIO_MEDIA_ID:count = db.delete("audio_meta",sGetTableAndWhereParam.where, whereArgs);break;default:// count = db.delete(sGetTableAndWhereParam.table,// sGetTableAndWhereParam.where, whereArgs);break;}getContext().getContentResolver().notifyChange(uri, null);}}……………………..}將上面紅色代碼注掉以後發現文件沒有被刪除,而紅色代碼只是對資料庫進行操作,因而文件應該是在清除資料庫的記錄時候被刪除的。仔細查看創建table的代碼發現幾個語句很奇怪,由於沒有網路去搜索一下關於android SQL的knowledge 只能猜測這個語句的意思了當然也怪偶沒去學學SQL。
db.execSQL("CREATE TRIGGER IF NOT EXISTS images_cleanup DELETE ON images " +"BEGIN " +"DELETE FROM thumbnails WHERE image_id = old._id;" +"SELECT _DELETE_FILE(old._data);" +"END");創建table為 images的觸發器,DELETE FROM thumbnails WHERE image_id = old._id正是刪除thumbnails的意思,對於Camera創建的Images會生成一個小圖片保存為thumbnail,這個記錄也是自動清除的。 "SELECT _DELETE_FILE(old._data);" 應該是刪除文件的意思。在Sqlite3_android.cpp文件中還真找到delete_file這個函數,加上log,進入gallery選擇一個文件刪除,打出了刪除文件名的全路徑。static void delete_file(sqlite3_context * context, int argc, sqlite3_value ** argv){………………….if (strncmp("/sdcard/", path, 8) != 0) { //只能刪除sdcard/路徑下的東西要刪除其他路sqlite3_result_null(context); //還需稍微改造一下return;}……………………}如何將文件保存在手機上MediaProvider中存在兩個資料庫一個是external對應文件系統為SD Card, 一個是內部資料庫internal用於手機flash上的文件系統。遺憾的是雖然MediaProvider提供了操作內外兩個資料庫的功能,但在發布的應用中並沒有使用這個內部文件系統。Android 默認狀態下Image,audio等文件是保存在SD card上。External, internal 資料庫都保存在手機文件系統上Path: /data/data/com.android.providers.media/database/如果要使用內部文件系統需要修改以下幾個地方1:MediaProvider generateFileName函數private String generateFileName(boolean internal, String preferredExtension, String directoryName){// create a random fileString name = String.valueOf(System.currentTimeMillis());if (internal) {throw new UnsupportedOperationException("Writing to internal storage is not supported.");// return Environment.getDataDirectory()// + "/" + directoryName + "/" + name + preferredExtension;} else {return Environment.getExternalStorageDirectory()+ "/" + directoryName + "/" + name + preferredExtension;}}恢復紅色部分代碼,將路徑設置為手機內部文件系統文件夾。2:保存文件使用的URI為content://media/internal/images/media/1紅色internal表名使用內部文件系統資料庫3:修改Sqlite3_android.cpp中delete_file函數static void delete_file(sqlite3_context * context, int argc, sqlite3_value ** argv){………………….if (strncmp("/sdcard/", path, 8) != 0 && strncmp("/data/media/", path, 12)) {sqlite3_result_null(context);return;}……………………}添加紅色部分,文件位於手機上/data/media路徑時也進行刪除。這樣當我們從資料庫里刪除一條記錄時,_data數據區存取的文件路徑中的文件也將自動刪除。

2. android獲取媒體資料庫問題

在你這個方法里再寫個參數context,把顯示列表的activity的對象傳給它,就行了

3. 【Android】如何通過content provider構建媒體文件資料庫(四)

遺憾的是雖然MediaProvider提供了操作內外兩個資料庫的功能,但在發布的應用中並沒有使用這個內部文件系統。 Android默認狀態下Image,audio等文件是保存在SD card上。External, internal 資料庫都保存在手機文件系統上 Path: /data/data/com.android.providers.media/database/ 如果要使用內部文件系統需要修改以下幾個地方 1:MediaProvider generateFileName函數 private String generateFileName(boolean internal, String preferredExtension, String directoryName){// create a random file String name = String.valueOf(System.currentTimeMillis()); if (internal) { throw new UnsupportedOperationException("Writing to internal storage is not supported."); // return Environment.getDataDirectory()// + "/" + directoryName + "/" + name + preferredExtension; } else { return Environment.getExternalStorageDirectory()

4. 如何對android多媒體資料庫進行增刪改

Android四種存儲方式: sharedpreference,file,SQlite,contentprovider。

1、SharedPreferences是一種輕型的數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。實現SharedPreferences存儲的步驟如下:

一、根據Context獲取SharedPreferences對象

二、利用edit()方法獲取Editor對象。

三、通過Editor對象存儲key-value鍵值對數據。

四、通過commit()方法提交數據。

具體實現代碼如下:實現存儲,讀取,清除,刪除

效果圖:

首先創建:// 首先拿到sharedpreference對象

mShared =getSharedPreferences(SHARED_MAIN_XML, MODE_PRIVATE);

存儲:

private void write() {// 存入數據

savename = name.getText().toString().trim();

saveage = Integer.valueOf(age.getText().toString().trim());

Editor editor = mShared.edit();

editor.putString("name", savename);

editor.putInt("age", saveage);

// 保證操作的事務完整性

editor.commit();

}

閱讀:

private String read() {// 從資料庫里讀取數據

namecontent = mShared.getString("name", "資料庫里沒有存儲姓名");

agecontent = mShared.getInt("age", 0);

String reading = "姓名:" + namecontent + "\n年齡:" + agecontent;

return reading;

}

清除內容:

private void clear() {//清除內容

/** 開始清除SharedPreferences中保存的內容 **/

Editor editor = mShared.edit();

editor.remove("name");

editor.remove("age");

editor.commit();

}

刪除文件:

private void delete() {//刪除文件

/** 刪除SharedPreferences文件 **/

Filefile = new File("/data/data/cn.csdn.activity" + "/shared_prefs/"

+ SHARED_MAIN_XML + ".xml");

if (file.exists()) {

file.delete();

Toast.makeText(this, "刪除成功", Toast.LENGTH_LONG).show();

}

}

haredPreferences對象與SQLite資料庫相比,免去了創建資料庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他數據存儲方式。

2、File: 即常說的文件(I/O)存儲方法,常用存儲大數量的數據,但是缺點是更新數據將是一件困難的事情。

下面實現:在本地data文件下使用自己生成的文件處理數據的新建儲存 讀取 刪除

如果說不想把內容存在SharedPreferences中的話,我們可以自己寫一個文件保存須要的數據,在這里我將文件保存在系統中的工程路徑下。

跟上面布局一樣,刪除文件也一樣,清除內容也查不多,下面只是簡單的寫和讀的方法:

寫:

17String
nameage="名字:"+name.getText().toString().trim()+"年齡:"+age.getText().toString();

try {

os = this.openFileOutput(SHARED_MAIN_XML, MODE_PRIVATE);

/* 把字元串轉換成位元組數組,寫入文件中 */

os.write(nameage.getBytes());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally {

try {

/* 關閉文件輸出流 */

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

讀:

private String read() {

String nameage="";

// 打開文件輸入流,

try {

is = this.openFileInput(SHARED_MAIN_XML);

/* 初始化位元組數組 */

b = new byte[1024];

/* 從文件輸入流中讀取內容到位元組數組中,返回內容長度 */

int length = is.read(b);

/* 把位元組數組轉換成字元串 */

nameage= new String(b);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return nameage;

}

很簡單吧!!

3、SQLite是一種轉為嵌入式設備設計的輕型資料庫,其只有五種數據類型,分別是:

NULL: 空值

INTEGER: 整數

REAL: 浮點數

TEXT: 字元串

BLOB: 大數據

它是一個輕量級的資料庫、非常小 、 移植性好、效率高、可靠

在Android系統中提供了android.database.sqlite包,用於進行SQLite資料庫的增、刪、改、查工作。

創建與刪除資料庫

封裝一個類去繼承SQLiteOpenHelper
在構造函數中傳入資料庫名稱與資料庫版本號,資料庫被創建的時候會調用onCreate(SQLiteDatabase db)
方法,資料庫版本號發生改變的時候會調用onUpgrade(SQLiteDatabase db, int oldVersion,
intnewVersion)方法,可以方便的對軟體游戲升級後做出相應處理避免覆蓋安裝資料庫發生改變產生的錯誤。調用SQLiteOpenHelper
的getReadableDatabase()方法去創建資料庫,如果資料庫不存在則創建並且返回SQLiteDatabase對象,如果資料庫存在則不創建只返回SQLiteDatabase對象。調用
deleteDatabase(DATABASE_NAME)方法 傳入資料庫名稱則可刪除資料庫。

第一種:詳細請看上一遍博客:android之利用SQLite資料庫實現登陸和注冊,http://blog.csdn.net/rhljiayou/article/details/7085347

下面介紹第二種:另一種添刪改查操作

效果圖:

布局文件很簡單,在此不再給出!!

直接給創建資料庫和表,增刪改查的代碼:

public class UserService {

private DatabaseHelper helper;

public UserService(Context context, String name, int version) {

helper = new DatabaseHelper(context, name, version);

}

public UserService(Context context, String name) {

helper = new DatabaseHelper(context, name);

}

public void insert(UserDao user) {// 插入數據

SQLiteDatabase sdb = helper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("username", user.getUsername());

values.put("password", user.getPassword());

sdb.insert("user", "name", values);

sdb.close();

}

public void delete(int id) {// 刪除數據

SQLiteDatabase sdb = helper.getWritableDatabase();

sdb.delete("user", "id=?", new String[]{String.valueOf(id)});

sdb.close();

}

public void update(UserDao user, int id) {// 更新數據

SQLiteDatabase sdb = helper.getWritableDatabase();

ContentValues values=new ContentValues();

values.put("username", user.getUsername());

values.put("password", user.getPassword());

sdb.update("user", values, "id=?", new String[]{String.valueOf(id)});

sdb.close();

}

public Cursor select() {// 查詢所有數據

SQLiteDatabase sdb = helper.getWritableDatabase();

return sdb.query("user", new String[]{"id as _id","username","password"},
null, null, null, null, null);

}

public UserDao find(int id){//按id查詢數據

UserDao user=null;

SQLiteDatabase sdb=helper.getWritableDatabase();

Cursor cursor=sdb.query("user", new String[]{"id","username","password"},
"id=?", new String[]{String.valueOf(id)}, null, null, null);

if(cursor.moveToFirst()){

user=new UserDao();

user.setId(cursor.getInt(0));

user.setUsername(cursor.getString(1));

user.setPassword(cursor.getString(2));

}

cursor.close();

sdb.close();

return user;

}

}

插入數據:通過insert(String table, StringnullColumnHack, ContentValues
values)方法插入數據,其中參數含義分別為:

table: 目標表名

nullColumnHack:
指定表中的某列列名。因為在SQLite中,不允許不允許插入所有列均為null的記錄,因此初始值有值為空時,此列需顯式賦予null

values:ContentValues對象,類似於java中的Map。以鍵值對的方式保存數據。

5. android中在怎麼獲取資料庫數據

android讀取資料庫可以使用sqlite一些api進行讀取,實例如下:
/**
* 查找一條數據
* @param uid
*/
public User find(Integer uid){
SQLiteDatabase db=dbOpenHelper.getReadableDatabase(); //創建資料庫輔助類
Cursor cursor =db.rawQuery("select * from user where uid=?", new String[]{uid.toString()}); //創建一個游標
if(cursor.moveToFirst()){ //循環遍歷查找數組
int uid2=cursor.getInt(cursor.getColumnIndex("uid"));
String uname=cursor.getString(cursor.getColumnIndex("uname"));
String uaddress=cursor.getString(cursor.getColumnIndex("uaddress"));
User user=new User();
user.setUid(uid2);
user.setUname(uname);
user.setUaddress(uaddress);
return user;
}
cursor.close();
return null;
}

6. 如何查看android自身媒體資料庫

public List<Music> getScrollData(int offset, int maxResult){
List<Music> musics = new ArrayList<Music>();
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
//遍歷媒體資料庫
if(cursor.moveToFirst()){
while (!cursor.isAfterLast()) {
//歌曲編號
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
//歌曲id
int trackId=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
//歌曲標題
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
//歌曲的專輯名:MediaStore.Audio.Media.ALBUM
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
//歌曲的歌手名: MediaStore.Audio.Media.ARTIST
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
//歌曲文件的路徑 :MediaStore.Audio.Media.DATA
String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
cursor.moveToNext();
musics.add(new Music(id,artist,title));
}
cursor.close();
}

return musics;
}
以下這句出現:NullPointerException問題
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

7. 如何操作android中的資料庫

Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。SQLiteOpenHelper 的子類,至少需要實現三個方法:
構造函數,調用父類 SQLiteOpenHelper 的構造函數
onCreate()方法;// TODO 創建資料庫後,對資料庫的操作
onUpgrage()方法。// TODO 更改資料庫版本的操作
當你完成了對資料庫的操作(例如你的 Activity 已經關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉資料庫連接。

8. 如何掃描出Android系統媒體庫中視頻文件

android系統啟動時會去掃描系統文件,並將系統支持的視頻文件(mp4,3gp,wmv)掃描到媒體庫(MediaStore)中,下面代碼演示如何獲得這些文件的信息:
public static List<VideoInfo> sysVideoList = null;// 視頻信息集合
sysVideoList = new ArrayList<VideoInfo>();
setVideoList();

private void setVideoList() {
// MediaStore.Video.Thumbnails.DATA:視頻縮略圖的文件路徑
String[] thumbColumns = { MediaStore.Video.Thumbnails.DATA,
MediaStore.Video.Thumbnails.VIDEO_ID };

// MediaStore.Video.Media.DATA:視頻文件路徑;
// MediaStore.Video.Media.DISPLAY_NAME : 視頻文件名,如 testVideo.mp4
// MediaStore.Video.Media.TITLE: 視頻標題 : testVideo
String[] mediaColumns = { MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.DISPLAY_NAME };

cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
mediaColumns, null, null, null);

if(cursor==null){
Toast.makeText(SystemVideoChooseActivity.this, "沒有找到可播放視頻文件", 1).show();
return;
}
if (cursor.moveToFirst()) {
do {
VideoInfo info = new VideoInfo();
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.Video.Media._ID));
Cursor thumbCursor = managedQuery(
MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID
+ "=" + id, null, null);
if (thumbCursor.moveToFirst()) {
info.setThumbPath(thumbCursor.getString(thumbCursor
.getColumnIndex(MediaStore.Video.Thumbnails.DATA)));
}
info.setPath(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)));
info.setTitle(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)));

info.setDisplayName(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)));
LogUtil.log(TAG, "DisplayName:"+info.getDisplayName());
info.setMimeType(cursor
.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE)));

sysVideoList.add(info);
} while (cursor.moveToNext());
}
}

有一點需要注意的是:系統的媒體庫並不會在我們添加視頻文件後自動更新,我們如何去手動掃描媒體庫,或者重啟系統才能從媒體庫中得到更新的視頻文件:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));

9. android 怎麼調用資料庫方法

SQLite也支持SQL標准類型,VARCHAR、CHAR、BIGINT等。
創建資料庫
Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,只要繼承 SQLiteOpenHelper 類,就可以創建資料庫。繼承了SQLiteOpenHelper的子類,必須實現三個方法:
1、構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2、onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3、onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣可以清楚如何把一個資料庫從舊的模型轉變到新的模型。

10. android怎麼鏈接資料庫mysql

有點多請耐心看完。
希望能幫助你,還請及時採納謝謝。
一.前言

android連接資料庫的方式有兩種,第一種是通過連接伺服器,再由伺服器讀取資料庫來實現數據的增刪改查,這也是我們常用的方式。第二種方式是android直接連接資料庫,這種方式非常耗手機內存,而且容易被反編譯造成安全隱患,所以在實際項目中不推薦使用。

二.准備工作

1.載入外部jar包

在Android工程中要使用jdbc的話,要導入jdbc的外部jar包,因為在Java的jdk中並沒有jdbc的api,我使用的jar包是mysql-connector-java-5.1.18-bin.jar包,網路上有使用mysql-connector-java-5.1.18-bin.jar包的,自己去用的時候發現不兼容,所以下載了比較新版本的,jar包可以去官網下載,也可以去網路,有很多前人們上傳的。

2.導入jar包的方式

方式一:

可以在項目的build.gradle文件中直接添加如下語句導入

compile files('libs/mysql-connector-java-5.1.18-bin.jar')
方式二:下載jar包復制到項目的libs目錄下,然後右鍵復制過來的jar包Add as libs

三.建立資料庫連接

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jdbc);
new Thread(runnable).start();
}

Handler myHandler=new Handler(){

public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Bundle data=new Bundle();
data=msg.getData();

//System.out.println("id:"+data.get("id").toString()); //輸出第n行,列名為「id」的值
Log.e("TAG","id:"+data.get("id").toString());
TextView tv= (TextView) findViewById(R.id.jdbc);

//System.out.println("content:"+data.get("content").toString());
}
};

Runnable runnable=new Runnable() {
private Connection con = null;

@Override
public void run() {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.jdbc.Driver");
//引用代碼此處需要修改,address為數據IP,Port為埠號,DBName為數據名稱,UserName為資料庫登錄賬戶,Password為資料庫登錄密碼
con =
//DriverManager.getConnection("jdbc:mysql://192.168.1.202:3306/b2b", "root", "");
DriverManager.getConnection("jdbc:mysql://http://192.168.1.100/phpmyadmin/index.php:8086/b2b",
UserName,Password);

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
testConnection(con); //測試資料庫連接
} catch (java.sql.SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void testConnection(Connection con1) throws java.sql.SQLException {
try {
String sql = "select * from ecs_users"; //查詢表名為「oner_alarm」的所有內容
Statement stmt = con1.createStatement(); //創建Statement
ResultSet rs = stmt.executeQuery(sql); //ResultSet類似Cursor

//<code>ResultSet</code>最初指向第一行
Bundle bundle=new Bundle();
while (rs.next()) {
bundle.clear();
bundle.putString("id",rs.getString("userid"));
//bundle.putString("content",rs.getString("content"));
Message msg=new Message();
msg.setData(bundle);
myHandler.sendMessage(msg);
}

rs.close();
stmt.close();
} catch (SQLException e) {

} finally {
if (con1 != null)
try {
con1.close();
} catch (SQLException e) {}
}
}
};

注意:

在Android4.0之後,不允許在主線程中進行比較耗時的操作(連接資料庫就屬於比較耗時的操作),需要開一個新的線程來處理這種耗時的操作,沒新線程時,一直就是程序直接退出,開了一個新線程處理直接,就沒問題了。

當然,連接資料庫是需要網路的,千萬別忘了添加訪問網路許可權:

<uses-permission android:name=」android.permission.INTERNET」/>

四.bug點

1.導入的jar包一定要正確

2.連接資料庫一定要開啟新線程

3.資料庫的IP一定要是可以ping通的,區域網地址手機是訪問不了的

4.資料庫所在的伺服器是否開了防火牆,阻止了訪問
————————————————
版權聲明:本文為CSDN博主「shuaiyou_comon」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/shuaiyou_comon/article/details/75647355

熱點內容
青驕如何重置賬號密碼 發布:2025-02-01 09:57:51 瀏覽:520
阿里雲伺服器鏡像市場 發布:2025-02-01 09:46:04 瀏覽:525
任子行伺服器管理口默認地址 發布:2025-02-01 09:42:58 瀏覽:996
設備作為FTP客戶端時 發布:2025-02-01 09:35:07 瀏覽:936
安卓如何登錄ios明日之後 發布:2025-02-01 09:31:59 瀏覽:306
怎麼查看手機存儲卡 發布:2025-02-01 09:31:51 瀏覽:341
java知識點總結 發布:2025-02-01 09:08:32 瀏覽:685
如何在手機版給伺服器加光影 發布:2025-02-01 09:02:14 瀏覽:728
簡單神器安卓系統的哪個好 發布:2025-02-01 09:00:48 瀏覽:355
社保卡密碼如何異地改密碼 發布:2025-02-01 08:57:22 瀏覽:34