注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Android SQLite解析(转载)  

2011-11-26 00:12:02|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

说到SQLite,无论C++、Java程序员还是其他的非主流程序员,应该都听说过它,可见其非常流行。SQLite是轻量级的、嵌入式的、关系 型数据库,目前已经在iPhone、Android等手机系统中使用,而且被其他的公司广泛使用,比如说:Adobe,具体SQLite的介绍可以到其官方网站浏览。

在学习Android SQLite前,必须对SQL语句有很深入的了解(如果忘记了,利用这次机会好好复习下)。关于数据库、表的创建等基础知识,由于篇幅有限就不在此详细说 明,主要说明数据库的4大基本操作:添加(insert)、删除(delete)、查询(query)、修改(update),这是在学习Android SQLite的过程中最为关注的部分。除了这4大操作以外,我们还需要注意的地方就是:获取查询结果的记录集(Recordset)。

Android SQLite分析

等有了这些基本概念,再来学习Android SQLite,从Android SDK中摘要如下:

SQLite-DB

首先关注到的是SQLiteDatabase类,在Android SDK中看其详细说明,其主要接口如下:

返回值 函数原型
long insert(String table, String nullColumnHack, ContentValues values)Convenience method for inserting a row into the database.
Int delete(String table, String whereClause, String[] whereArgs)Convenience method for deleting rows in the database.
Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)Query the given table, returning a Cursor over the result set.
Int update(String table, ContentValues values, String whereClause, String[] whereArgs)Convenience method for updating rows in the database.

看到这些是不是感到似曾相识了?不错,这就是数据库的4大基本操作:添加(insert)、删除(delete)、查询(query)、修改(update)。感觉轻松很多了,再仔细看下这些函数的参数,发现很多参数都是按照SQL语句定义的,

例如:select * from p_employee  where id <>’9999′   order by id asc

需要额外说明2个数据结构: ContentValues,Cursor;

ContentValues就相当于C++中的map[(String key, Integer value)],其主要接口包括put(),get()。再结合insert操作的主要目的:按照表中数据段将对应的数据项写入到表中,就可以看出来 ContentValues主要是存放表中每个表的数据段,以及其对应的值。

Cursor也就是前面说的:查询结果的记录集。从记录集的特征可以想到其包含的操作应该有:MoveFirst()、MoveLast()、 MoveNext()、Move()、IsLast()、GetColumns()等,而且它还是个抽象类[abstract class],SQLiteCursor就是其具体的实现。

关于SQLiteDatabase类,其他值得关注的函数是:Create()、execSQL()。至于其他的函数,比如beginTransaction(),endTransaction()等关于数据库同步操作的函数,就只有在使用的过程中深入了解。

额外补充说明

最后值得一提的是:一个很好的辅助类SQLiteOpenHelper,其简化了数据库的操作。按照Android SDK文档中的说明,也可以通过继承此类、改写其接口的方法来实现对数据库的操作,SQLiteOpenHelper,其主要接口如下:
SQlite-Helper

仔细分析其说明,发现这个类主要是创建一个数据库,并对数据库的版本进行管理。当在程序中调用这个类的方法 getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据库,那么Android系统就 会自动创建一个数据数据库。

其他辅助说明

  • 所有的数据库文件存放在手机中的/data/data/package_name/databases路径下。最为重要的一点 是:在Android中,所有的应用软件的数据(包括文件、数据库)为该应用软件所私有的,如果需要在不同的应用中共享数据,必须使用 ContentProvider实现,一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此 ContentProvider的各种数据类型。
  • 为了方便测试,如何查看SQLite数据库的内容?使用Android SDK提供的工具:sqlite3.exe。这是一个命令行实用工具,列举主要使用的命令如下:查看表结构 sqlite3 “path”    .dump
    例如 G:\android\android-sdk-window\tools>sqlite3 30m.db3    .bump
    运行结构如下:BEGGIN TRANSACTION;
    CREATE TABLE [TmProgramm] ([index] INTEGER,[nID] INTEGER, [nChannelID] INTEGER,[strTitle] CHAR(255),
    [dwDuration] INTEGER, [strThumbNail] CHAR(1024),[strURL] CHAR(255),[strPathName] CHAR(255),
    [strAuthor] CHAR(255),[dwSize] INTEGER,[State] INTEGER,[Percent] INTEGER,
    [strConverted] CHAR(255),[dwVideoType] INTEGER,[dwDownloadedBytes] INTEGER,[strTime] CHAR(255),
    [strHTTPVersion] CHAR(255),[strUserAgent] CHAR(255),[strReferer] CHAR(255));
    COMMIT;
    这就是当初创建数据库的语句
    查看表中的内容 sqlite3   “path” .schema
    具体运行结果可以下载数据库文件30m.db3 ,在命令行中运行就可以看到了
    其他帮助命令查询 sqlite3 .help

总结说明

通过对以上的学习,简单写了个数据库的例子(moandroid.database.zip),大家可以参考下。

原文链接:
http://www.moandroid.com/?p=112&cpage=1#comment-3126

补充一个自己的例子(参考转载的文章)

package com.platform;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBUtils {
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_LANGUAGE = "language";
    public static final String COLUMN_MARK = "mark";
    private static final String TAG = "SQLiteDemo";
    private static final String DATABASE_NAME = "text";
    private static final String TABLE_NAME = "result";
    private static final int DATABASE_VERSION = 1;
    private static final String CREATE_TABLE = "create table " + TABLE_NAME
            + " ( _id integer primary key autoincrement,"
            + " language text not null, mark text not null );";
    private final Context context;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public DBUtils(Context ctx) {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        // @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE);
        }

        // @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }
    }

    // ---Open DB---
    public DBUtils open() throws SQLException {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    // ---close DB---
    public void close() {
        DBHelper.close();
    }

    // ---insert one result---
    public long insertOneRusult(String language, String mark) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(COLUMN_LANGUAGE, language);
        initialValues.put(COLUMN_MARK, mark);
        return db.insert(TABLE_NAME, null, initialValues);
    }

    // ---delete one result by id---
    public boolean deleteById(long id) {
        return db.delete(TABLE_NAME, COLUMN_ID + "=" + id, null) > 0;
    }

    // ---query all results---
    public Cursor getAllRusults() {
        String columns[] = { COLUMN_ID, COLUMN_LANGUAGE, COLUMN_MARK };
        return db.query(TABLE_NAME, columns, null, null, null, null, null,
                null);
    }

    // ---get result by id---
    public Cursor getRusultById(long id) throws SQLException {
        String columns[] = { COLUMN_ID, COLUMN_LANGUAGE, COLUMN_MARK };
        Cursor mCursor = db.query(true, TABLE_NAME, columns, COLUMN_ID
                + "=" + id, null, null, null, null, null);
        if (mCursor != null)
            mCursor.moveToFirst();
        return mCursor;
    }

    // ---update result---
    public boolean updateTitle(long id, String language, String mark) {
        ContentValues args = new ContentValues();
        args.put(COLUMN_LANGUAGE, language);
        args.put(COLUMN_MARK, mark);
        return db.update(TABLE_NAME, args, COLUMN_ID + "=" + id, null) > 0;
    }
    /*
     使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,
     程序执行到endTransaction() 方法时会检查事务的标志是否为成功,
     如果程序执行到endTransaction()之前调用了setTransactionSuccessful()方法设置事务的标志为成功则提交事务,
     如果没有调用setTransactionSuccessful() 方法则回滚事务。
     */
    //begin Transaction
    public void beginTransaction() {
        db.beginTransaction();
    }
    // commit
    public void commit() {
        db.setTransactionSuccessful();
        db.endTransaction();
    }
    // roll back
    public void rollBack() {
        db.endTransaction();
    }
    //use sql statement
    public Cursor queryBySQL(String sql,String[] selectionArgs) {
        return db.rawQuery(sql, selectionArgs);
    }
}

  评论这张
 
阅读(332)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017