SQLite数据库详解

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

前言:

 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>
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值