如何将音频或者音频路径存入SQLite数据库中,又怎么读取
SQLite数据库存储数据
SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟MySQL、sql server差不多的。
SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。
对数据库SQLite进行操作,我们要借助于SQLiteOpenHelper类进行操作。对数据库的操作也就是”增、删、改、查“。在学习数据库的操作之前我们首先要学会如何创建数据库……
创建数据库
数据库的操作借助于SQLiteOpenHelper,SQLiteOpenHelper是一个抽象类,我们我们在使用SQLiteOpenHelper时要先创建一个MySQLiteOpenHelper继承SQLiteOpenHelper类。
SQLiteOpenHelper有两个非常重要的方法:getReadableDatabase()方法返回数据库是一个只读的;getWriteableDatabase()方法获得是一个可读写的数据库对象。这里我们使用getWriteableDatabase()方法获得数据库Database对象。
添加数据
使用SQLiteDatabase的insert(String table, String nullColumnHack, ContentValues values)方法插入数据。这个方法包含三个参数:
我们先列举一条SQLite中的插入语句:INSERT INTO user (name, passwords)] VALUES ("张三", "123456");
String table:操作的数据表的名称。
String nullColumnHack:用于我们在未指定添加数据的情况下,为数据表中可以添加null值的数据填入null值。一般这个参数我们传入null。
ContentValues values:用于传递数据,通常我们通过ContentValues 类的对象的putXXX()方法封装数据,然后将数据添加进数据库。
ContentValues 类,类似于Java中的Map,以键值对的方式保存数据。
删除数据
使用SQLiteDatabase的delete(String table, String whereClause, String[] whereArgs)方法删除数据。这个方法包含三个参数:
我们先列举一条SQLite中的删除语句:DELETE FROM user WHERE name="张三"。
String table:操作的数据表的名称。
String whereClause:约束删除行的条件。相当于SQLite语句中“where name=?“内容。
String[] whereArgs:与前一个参数对应约束删除行的条件。相当于”where name=”张三““中的”张三“。
注意:如果参数String whereClause和参数String[] whereArgs都传null的话,就是删除所有行。
修改数据
使用SQLiteDatabase的 update (String table, ContentValues values, String whereClause, String[] whereArgs)方法删除数据。这个方法包含四个参数:
我们先列举一条SQLite中的修改语句:UPDATE user SET name= "李四", passwords= "123" WHERE name="张三"。
String table:操作的数据表的名称。
ContentValues values:用于传递数据,通常我们通过ContentValues 类的对象的putXXX()方法封装数据,然后将数据添加进数据库。
String whereClause:约束修改行的条件。相当于SQLite语句中“where name=?“内容。
String[] whereArgs:与前一个参数对应约束删除行的条件。相当于”where name=”张三““中的”张三“。
查询数据
对于”查“操作,SQLiteDatabase提供了多种方法。
我们先列举一条SQLite中的修改语句:SELECT passwords="123" FROM user。
(1)使用SQL语句进行查询。这里SQLiteDatabase提供了方法:
rawQuery (String sql, String[] selectionArgs):该方法返回 Cursor类的对象,用于操作查询的结果。
(2)使用SQLiteDatabase内定方法查询:
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):这个方法有N多个参数啊……String table是操作的数据表的名称;String selection是筛选的字段选项;String[] selectionArgs是字段选项对应的值;String groupBy是筛选结果的分组依据;String having是在由groupBy子句创建的分组上设置条件;String orderBy是结果的排序方式,String limit是筛选结果的显示限制,例如“2, 3”是指从筛选结果的第2个开始显示3个。
音频文件路径 :android 工程中的声音文件一般位于raw文件夹下;
res->raw,也可以重新在res下创建一个新的文件夹;
一般使用sharepreferences存储技术
public class MusicUtils {
// 存放歌曲列表
public static ArrayList sMusicList = new ArrayList();
public static void initMusicList() {
// 获取歌曲列表
sMusicList.clear();
sMusicList.addAll(LocalMusicUtils.queryMusic(getBaseDir()));
}
/**
* 获取内存卡根
* @return
*/
public static String getBaseDir() {
String dir = null;
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_UNMOUNTED)) {
dir = Environment.getExternalStorageDirectory() + File.separator;
} else {
dir = App.sContext.getFilesDir() + File.separator;
}
return dir;
}
/**
* 获取应用程序使用的本地目录
* @return
*/
public static String getAppLocalDir() {
String dir = null;
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_UNMOUNTED)) {
dir = Environment.getExternalStorageDirectory() + File.separator
+ "Music" + File.separator;
} else {
dir = App.sContext.getFilesDir() + File.separator + "Music" + File.separator;
}
return mkdir(dir);
}
/**
* 获取音乐存放目录
* @return
*/
public static String getMusicDir() {
String musicDir = getAppLocalDir();
return mkdir(musicDir);
}
/**
* 获取歌词存放目录
*
* @return
*/
public static String getLrcDir() {
String lrcDir = getAppLocalDir();
return mkdir(lrcDir);
}
/**
* 创建文件夹
* @param dir
* @return
*/
public static String mkdir(String dir) {
File f = new File(dir);
if (!f.exists()) {
for (int i = 0; i < 5; i++) {
if(f.mkdirs()) return dir;
}
return null;
}
return dir;
}
/**
* 获取目录下的歌曲
* @param dirName
*/
public static ArrayList<Music> queryMusic(String dirName) {
ArrayList<Music> results = new ArrayList<Music>();
Cursor cursor = App.sContext.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
MediaStore.Audio.Media.DATA + " like ?",
new String[] { dirName + "Music/" + "%" },
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if(cursor == null) return results;
// id title singer data time image
Music music;
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
// 如果不是音乐
String isMusic = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_MUSIC));
if (isMusic != null && isMusic.equals("")) continue;
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
if(isRepeat(title, artist)) continue;
music = new Music();
music.setId(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)));
music.setTitle(title.toString());
music.setArtist(artist.toString());
music.setUri(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
music.setLength(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)));
music.setImage(getAlbumImage(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID))));
results.add(music);
}
cursor.close();
return results;
}
/**
* 播放
* @param position 音乐列表的位置
* @return 当前播放的位置
*/
public int play(int position) {
if(position < 0) position = 0;
if(position >= MusicUtils.sMusicList.size()) position = MusicUtils.sMusicList.size() - 1;
try {
mPlayer.reset();
mPlayer.setDataSource(MusicUtils.sMusicList.get(position).getUri());
mPlayer.prepare();
start();
if(mListener != null) mListener.onChange(position);
} catch (Exception e) {
e.printStackTrace();
}
mPlayingPosition = position;
SpUtils.put(Constants.PLAY_POS, mPlayingPosition);
if(!readyNotification){
startNotification();
}else{
setRemoteViews();
}
return mPlayingPosition;
}
android实现音乐播放器:
http://blog.csdn.net/u014078192/article/details/22827397