一 .要在android里面使用数据库, 首先必须熟悉数据库的操作.在此我们只需要熟悉sqlite3的数据库操作就可以了.
1. 理论上sqlite3数据库是支持任何数据格式,所以你甚至可以用数据库来存放图片,当然也可以自己定义数据格式进行存取.
2. sqlite3的命令参数当中有一条比较有意思 也是比较有用的.就是 -init 命令参数,该指令可以指定sqlite3依此执行一个文件里面的命令.
这样我们就可以将本来要在数据库shell下输入的命令写到一个文件里面,然后用sqlite3 -init 来指定那个文件运行一系列命令.
for example:
我们新建一个文件command 里面有如下内容:
create table Applications (rowid integer primary key autoincrement,packagename text not null, classname text not null,appname text,iconname text);
.separator ,
.import Applications.txt Applications
SELECT * FROM Applications;
.quit
然后我们新建一个shell脚本 autoSQL.sh 内容如下:
#!/bin/sh
echo ".quit"|sqlite3 -init yyyyy.sh packages
以上2个步骤目的就是让sqlite3执行command文件里的一系列命令.这里有一个地方要注意就是command文件里面的命令之间
要没有tab和空格 等不需要的符号,每条命令用回车结束.
3. 在上面的例子里面 你会看到sqlite3 shell下面的导入其他文件到数据库的命令 .import (sqlite3 shell下的命令都是以点开头的)
.import Applications.txt Applications 这条指令是导入一个叫Applications.txt的文件里面的数据到一个叫Applications
的table.记住是导入到表. 然后就是主要数据格式和表的对应.
这里的Applications.txt文本的内容如下:
1,com.google.android.browser,BrowserActivity,1,1
2,com.google.android.maps,Maps,1,1
3,com.alamobile.dial,DialActivity,1,1
4,com.google.android.phone,Dialer,1,1
5,com.google.android.samples,ApiDemos,1,1
6,com.alamobile.android.calculator,calculator,1,1
7,com.alamobile.android.calendar,DayProfile,1,1
8,com.alamobile.android.keyboard,Keyboard,1,1
9,com.alamobile.android.audioplayer.activity,MediaLibraryListView,1,1
10,com.alamobile.android.taskmanager,TaskList,1,1
11,com.once.MyWeb,MyWeb,1,1
12,com.archermind.linux.userpwd,UserPwd,1,1
(同样这里的指令之间不要有不需要的tab和空格等符号)
可以看出来 这里的文本里面的数据是5个数据一组记录,每个数据之间用逗号隔开.所以我们要在sqlite的shell下面用命令"".separator , "
指定导入数据的间断符逗号.(其实这里不是sqlite3特有的 其他数据库也是这么导入的)
4. 说到这里你可能会说这些命令我可以在shell里面输入的啊 我干嘛要这么费力的去写什么文件文本的啊.其实这样做的目的是为了可以
利用shell文件自动的生成一个需要的数据库,可以省去很多的操作麻烦(sqlite的shell实在不是很好用)
下面给大家看一个shell脚本作为以上总结和应用的例子:
#!/bin/sh
echo "1,com.google.android.browser,BrowserActivity,1,1
2,com.google.android.maps,Maps,1,1
3,com.alamobile.dial,DialActivity,1,1
4,com.google.android.phone,Dialer,1,1
5,com.google.android.samples,ApiDemos,1,1
6,com.alamobile.android.calculator,calculator,1,1
7,com.alamobile.android.calendar,DayProfile,1,1
8,com.alamobile.android.keyboard,Keyboard,1,1
9,com.alamobile.android.audioplayer.activity,MediaLibraryListView,1,1
10,com.alamobile.android.taskmanager,TaskList,1,1
11,com.once.MyWeb,MyWeb,1,1
12,com.archermind.linux.userpwd,UserPwd,1,1" >> Applications.txt
echo "
create table Applications (rowid integer primary key autoincrement,packagename text not null, classname text not null,appname text,iconname text);
.separator ,
.import Applications.txt Applications
SELECT * FROM Applications;
.quit">> yyyyy.sh
echo ".quit"|sqlite3 -init yyyyy.sh packages
/work/android_sdk_linux_m3-rc37a/tools/adb push packages /data/data/com.alamobile.application/databases
rm Applications.txt
rm packages
rm yyyyy.sh
二. 下面一部分 是我找到的一些在sqlite3下面常用的命令和使用格式 我罗列一下 大家需要的时候可以找找看一下就可以用了.
sqlite3 packages //这里是生成一个名字叫做packages的数据库db文件
create table Applications(rowid interge primary key autocrement,//创建一个表Applications 有个自动生成的int型的rowid 并作为主键
packagename text not null, //一个文本性质的packagename 并且不能为空
classname text, //一个可以为空的文本 classname
iconname text
);
insert into Applications values(13,"com","i",null); //插入一个rowid为13的记录
delete from Applications where rowid=13;
select * from Application;
update Application set packagename="fuck" where rowid=13;
以上指令都是单行操作的 当然你也可以指定条件进行多条记录的操作.我只用select举例.
select rowid,* from Applications where rowid between 10 and 20;
select rowid,* from Applications where rowid>10 and rowid<20;
select rowid,packagename from Applications;
select SUM(rowid),packagename where ...;
select * from Application order by packagename;
sqlite3不区分大小写 所有命令用分号结束.
三. 最后是如何在android代码里面使用sqlite3
首先一个用来操作sqlie的数据库操作类DBcontrol.java(一般情况下只需要复制这个类使用就够了 除非要加特殊操作)
package com.once.DBcreate;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
public class DBcontrol {
class Row extends Object {
public String appname;
public long rowId;
public String pkgname;
}
private static final String DATABASE_CREATE =
"create table packagename (rowid integer primary key autoincrement, "
+ "pkgname text not null, appname text not null);";
private static final String DATABASE_NAME = "package";
private static final String DATABASE_TABLE = "packagename";
private static final int DATABASE_VERSION = 1;
private SQLiteDatabase db;
public DBcontrol(Context ctx) {
try {
db = ctx.openDatabase(DATABASE_NAME, null);
} catch (FileNotFoundException e) {
try {
db =
ctx.createDatabase(DATABASE_NAME, DATABASE_VERSION, 0,
null);
db.execSQL(DATABASE_CREATE);
} catch (FileNotFoundException e1) {
db = null;
}
}
}
public void close() {
db.close();
}
public void createRow(String pkgname, String appname) {
ContentValues initialValues = new ContentValues();
initialValues.put("pkgname", pkgname);
initialValues.put("appname", appname);
db.insert(DATABASE_TABLE, null, initialValues);
}
public void deleteRow(long rowId) {
db.delete(DATABASE_TABLE, "rowid=" + rowId, null);
}
public List<Row> fetchAllRows() {
ArrayList<Row> ret = new ArrayList<Row>();
try {
Cursor c =
db.query(DATABASE_TABLE, new String[] {
"rowid", "pkgname", "appname"}, null, null, null, null, null);
int numRows = c.count();
c.first();
for (int i = 0; i < numRows; ++i) {
Row row = new Row();
row.rowId = c.getLong(0);
row.pkgname = c.getString(1);
row.appname = c.getString(2);
ret.add(row);
c.next();
}
} catch (SQLException e) {
Log.e("[--------------xxw--------------]", e.toString());
}
return ret;
}
public Row fetchRow(long rowId) {
Row row = new Row();
Cursor c =
db.query(true, DATABASE_TABLE, new String[] {
"rowid", "pkgname", "appname"}, "rowid=" + rowId, null, null,
null, null);
if (c.count() > 0) {
c.first();
row.rowId = c.getLong(0);
row.pkgname = c.getString(1);
row.appname = c.getString(2);
return row;
} else {
row.rowId = -1;
row.appname = row.pkgname = null;
}
return row;
}
public void updateRow(long rowId, String pkgname, String appname) {
ContentValues args = new ContentValues();
args.put("pkgname", pkgname);
args.put("appname", appname);
db.update(DATABASE_TABLE, args, "rowid=" + rowId, null);
}
}
在其他类里面可以
private DBcontrol dbctrl;
private List<Row> rows;
dbctrl = new DBcontrol(this);
rows = dbctrl.fetchAllRows();
dbctrl.deleteRow(rowId); //int rowId=1;
Row data=dbctrl.fetchRow(rowId);
dbCtrl.createRow("title", "body");
dbCtrl.updateRow(rowId, "title", "body");
public void run() {
// We first open the CameraDevice and configure it.
CameraDevice camera = CameraDevice.open();
if (camera != null) {
CameraDevice.CaptureParams param = new CameraDevice.CaptureParams();
param.type = 1; // preview
param.srcWidth = 1280;
param.srcHeight = 960;
param.leftPixel = 0;
param.topPixel = 0;
param.outputWidth = 320;
param.outputHeight = 240;
param.dataFormat = 2; // RGB_565
camera.setCaptureParams(param);
}
// This is our main acquisition thread's loop, we go until
// asked to quit.
SurfaceHolder holder = mHolder;
while (!mDone) {
// Lock the surface, this returns a Canvas that can
// be used to render into.
Canvas canvas = holder.lockCanvas();
// Capture directly into the Surface
if (camera != null) {
camera.capture(canvas);
}
// And finally unlock and post the surface.
holder.unlockCanvasAndPost(canvas);
}
// Make sure to release the CameraDevice
if (camera != null)
camera.close();
}
Android Database【origin】
最新推荐文章于 2024-08-24 09:57:30 发布