Android Database【origin】

来源:互联网 发布:windows toolkit2.5.1 编辑:程序博客网 时间:2024/04/28 11:44

一 .要在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();
        }

原创粉丝点击