android媒体数据库
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