SQLite数据库详解

来源:互联网 发布:阿里云电话人工服务 编辑:程序博客网 时间:2024/05/01 16:23

本文主要对数据库的创建和使用

前言:

 SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:

1、轻量级

SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。

2、独立性

SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。

3、隔离性

SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。

4、跨平台

SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。

5、多语言接口

SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。

6、安全性

SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。

1.创建MySqliteHelper继承SQLiteOpenHelper帮助类

/** * aqliteOpenHelper * 1.提供了onCreate() onUpgrade() 等创建数据库更新数据库的方法 * 2.提供了获取数据库对象的函数 * 3.数据库创建了一次就不会再走onCreate的方法 */public class MySqliteHelper extends SQLiteOpenHelper {    /**     * 构造函数     * @param context  上下文对象     * @param name  表示创建数据库的名称     * @param factory  游标工厂     * @param version  表示创建数据库的版本  >=1     */    public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public MySqliteHelper(Context context) {        super(context, Constant.DATABASE_NAME, null, Constant.DATABASE_VERSION);    }    /**     * 当数据库创建时回调的函数     * @param sqLiteDatabase 数据库对象     */    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        Log.i("tag" ,"--------onCreate-------");        String sql = "create table " + Constant.TABLE_NAME +"("+ Constant._ID +" Integer primary key ," +                ""+ Constant.NAME +  "varchar(10)," +  Constant.AGE + " Integer)";        sqLiteDatabase.execSQL(sql);  //执行sql语句    }    /**     * 当数据库版本更新时回调的函数     * @param sqLiteDatabase 数据库对象     * @param i  数据库旧版本     * @param i1 数据库新版本     */    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {        Log.i("tag" ,"--------onUpgrade-------");    }    /**     * 当数据库打开时回调的函数     * @param db 数据库对象     */    @Override    public void onOpen(SQLiteDatabase db) {        super.onOpen(db);        Log.i("tag" ,"--------onOpen-------");    }}

2.创建一个Constant常量类 方便以后更改数据 

** * 常量类 便于修改 * DATABASE_NAME后期更改只需要更改后面的变量 "info.db"更改 前面的常亮不需要更改 */public class Constant {    public static final String DATABASE_NAME = "info.db";  //数据库名称    public static final int  DATABASE_VERSION = 1;  //数据库的版本号    public static final String TABLE_NAME = "person";  // 表名    public static final String _ID = "_id" ;    public static final String NAME = "name" ;    public static final String AGE = "age" ;}

3.创建DbManager 主要是对数据库操作的工具类

public class DbManger {    private static MySqliteHelper helper ;    /**     * 单列模式     */    public static MySqliteHelper getIntance (Context context){        if (helper == null){            helper = new MySqliteHelper(context);        }        return helper;    }    /**     * 根据sql语句在数据库中执行语句     * @param db  数据库对象     * @param sql  sql语句     */    public static void execSQL(SQLiteDatabase db , String sql ){        if (db != null){            if (sql != null && "".equals(sql)){                db.execSQL(sql);            }        }    }}


4.Main方法中数据库的增删改
public class MainActivity extends AppCompatActivity {    private MySqliteHelper mMySqliteHelper;    private SQLiteDatabase mDb;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 获得数据库帮助类对象        mMySqliteHelper = DbManger.getIntance(this);    }    /**     * 创建数据库     * @param view     */    public void createDb(View view){        /**         * getWritableDatabase() getReadableDatabase() 创建或打开数据库         * 如果数据库不存在则创建数据库 如果数据库存在直接打开数据库         * 默认情况下两个函数都表示打开或者创建可读可写的数据库对象 如果磁盘已满或者是数据库本身的权限等情况下         * getReadableDatabase() 打开的是只读数据库         */        SQLiteDatabase db = mMySqliteHelper.getWritableDatabase();    }    //    public void click(View view){        switch (view.getId()){            // 插入数据            case R.id.btn_insert:                mDb = mMySqliteHelper.getWritableDatabase();                String insert_sql = "inster into "+ Constant.TABLE_NAME +" values(1,'ZhangSan',20)";                DbManger.execSQL(mDb,insert_sql);                String insetrt_sql2 = "inster into " + Constant.TABLE_NAME  + " values(2,'LiSi',30)";                DbManger.execSQL(mDb,insetrt_sql2);                mDb.close();                break;            //修改数据            case R.id.btn_update:                mDb = mMySqliteHelper.getReadableDatabase();                // String upDate_sql = "update person set name = 'XiaoMing' where _id =1" ;                String upDate_sql = "update "+ Constant.TABLE_NAME+" set " +                        ""+Constant.NAME+" = 'XiaoMing' where "+Constant._ID+" =1" ;                DbManger.execSQL(mDb,upDate_sql);                mDb.close();                break;            //删除语句            case R.id.btn_delete:                mDb = mMySqliteHelper.getWritableDatabase();                String delet_sql = "delete from "+ Constant.TABLE_NAME +" where "+Constant._ID +" = 2";                DbManger.execSQL(mDb,delet_sql);                mDb.close();        }    }    // API文档调用增删改    public void onClick(View view){        switch (view.getId()){            case R.id.btn_insertapi:                mDb = mMySqliteHelper.getWritableDatabase();                /**                 * inseter (String table  ,String nullColumnHack , ContentValues values)                 * String table 表示插入数据表的名称                 * String nullColumnHack  null值                 * ContentValues values 键为String 类型的Hashmap集合                 * 返回值 log 表示插入数据列数                 */                ContentValues values = new ContentValues();                values.put(Constant._ID,3); //put (表示插入字段的名称 ,表示插入的具体值)                values.put(Constant.NAME,"王五");                values.put(Constant.AGE,29);                long result = mDb.insert(Constant.TABLE_NAME,null,values );                if (result>0){                    Toast.makeText(this,"插入数据成功",Toast.LENGTH_LONG).show();                }else {                    Toast.makeText(this,"插入数据失败",Toast.LENGTH_LONG).show();                }                mDb.close();                break;            case R.id.btn_updateapi:                mDb = mMySqliteHelper.getWritableDatabase();                /**                 *update(String table, ContentValues values, String whereClause, String[] whereArgs)                 * String table 表示修改数据库的名称                 * ContentValues values  表示键为String 类型的hashmap                 * String whereClause 表示修改条件                 * String[] whereArgs  表示修改条件的占位符                 *返回值表示修改的条数                 */                ContentValues count_values = new ContentValues();                count_values.put(Constant.TABLE_NAME,"小牧"); //(修改需要的字段名称,修改后的字段值)                //int count = mDb.update(Constant.TABLE_NAME,count_values,Constant._ID+"=3",null); //两种写法                int count = mDb.update(Constant.TABLE_NAME,count_values,Constant._ID+"=?",new String[]{"3"});                if (count>0){                    Toast.makeText(this,"修改数据成功",Toast.LENGTH_LONG).show();                }else {                    Toast.makeText(this,"修改数据失败",Toast.LENGTH_LONG).show();                }                mDb.close();                break;            case R.id.btn_deleteapi:                mDb = mMySqliteHelper.getWritableDatabase();                /**                 * String table 删除的表名                 * String whereClause 删除的条件                 * String[] whereArgs 删除条件的占位符                 */                int delete =  mDb.delete(Constant.TABLE_NAME,Constant._ID+"=?",new String[]{"1"});                if (delete>0){                    Toast.makeText(this,"删除数据成功",Toast.LENGTH_LONG).show();                }else {                    Toast.makeText(this,"删除数据失败",Toast.LENGTH_LONG).show();                }                mDb.close();                break;        }    }}

最后我把xml文件也贴给大家

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.unruly_zhao.unruly_sqlite.MainActivity"    android:orientation="vertical">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="创建数据库"       />    <Button        android:id="@+id/btn_insert"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="插入数据"        android:layout_marginTop="20dp"        android:onClick="click"/>    <Button        android:id="@+id/btn_update"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="修改数据"        android:layout_marginTop="20dp"        android:onClick="click"/>    <Button        android:id="@+id/btn_delete"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="删除数据"        android:layout_marginTop="20dp"        android:onClick="click"/>    <!--通过api的形式插入-->    <Button        android:id="@+id/btn_insertapi"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="插入数据_API方式"        android:layout_marginTop="20dp"        android:onClick="onClick"/>    <Button        android:id="@+id/btn_updateapi"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="修改数据_API方式"        android:layout_marginTop="20dp"        android:onClick="onClick"/>    <Button        android:id="@+id/btn_deleteapi"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="删除数据_API方式"        android:layout_marginTop="20dp"        android:onClick="onClick"/></LinearLayout>