Adroid之SqliteDatabase学习笔记

Android之SqliteDatabase数据库学习笔记

1.SqliteDatabase概述:

大家对sqlite数据库应该是比较了解的,他是一个轻量级的数据库,并且他只是一个嵌入式的数据库引擎,专门适合于资源有限的设备(如手机、PAD等)上存储适量的数据。那么android为我们提供了SqliteDatabase代表一个数据库(底层就是一个数据库文件),只要获取到这个对象,我们就可以对数据库进行操作和管理了。

2.先看看SqliteDatabase为我们提供了如下打开静态方法来打开一个文件对应的数据库:

static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打开path路径文件所代表的Sqlite数据库

static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactoryFactory) 打开或创建(如果不存在)file文件所代表的数据库。

static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打开或创建(如果不存在)path路径所代表的数据库。

3.通过上面的静态方法就可以获取SQLiteDatabase实例了,在有了这个对象后,我们就可以通过如下的方法来操作数据库了

execSQL(String sql, Object[] bindArgs):执行带占位符的SQL语句

sql:代表要执行的sql语句 例如查询语句:select * from student where age = ?
bindArgs:占位符的值,如上语句中age = ? 假如我们需要查询年级为20岁的,则我们可以写上  
这个参数即可: new Object[]{10}

execSQL(String sql):执行SQL语句

insert(String table, String nullColumnHack, ContentValues values):
向指定的表中插入数据

table:表名
nullColumnHack:如果后面的values参数为null或者不包含任何key-value对时这该参数  
有效,表示强行插入该数值
values:一行的记录值

update(String table, ContentValues values, String whereClause, String[] whereArgs):更新指定表中的特定数据

table:表名
            values:想更新的值
            whereClause:满足该参数子句的记录将会被更新
            whereArgs:用于为子句的占位符传入参数

delete(String table, String whereClause, String[] whereArgs):删除指定表中的特定数据

    table:表名
    whereClause:满足该参数子句的记录将会被删除
    whereArgs:用于为子句的占位符传入参数

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy):对指定的数据表进行查询

table:表名
colnums:要查询出来的列名,相当于select语句select关键字后面的部分
selection:查询条件子句,相当于select语句where关键字后面的部分,  
该子句中允许占位符?
seletctionArgs:查询子句selection的占位符的参数
gropBy:用于控制分组,相当于select语句group by关键字后面的部分
having:用于对分组进行过滤。相当于select语句having关键字后面的部分
orderBy:用于对记录进行排序,相当于select语句order by关键字后面的部分,  
如name desc 、age 
asc。  desc(表示降序,从大到小)asc(表示升序,从小到大)

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):对指定的数据表执行查询,limit参数控制最多查询几条记录(用于控制分页的参数)

limit:用于进行分页。相当于select语句limit关键字后面的部分,如 2,5(表示从第3条数据开始  
查询,查询5条数据)

query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):对指定的数据表执行查询。其中第一个参数控制是否除去重复值

distinct:指定是否去除重复的记录

rawQuery(String sql, String[] selectionArgs):执行带占位符的SQL语句。

sql:sql语句
selectionArgs:占位符的参数

beginTransaction():开始事务

endTransaction():结束事务

4.如何创建数据库和表

//创建数据库,如果该文件下不存在数据库就创建,存在就打开,
//getFilesDir()获取的路径是:/data/data/对应你的包名(com.itrealman.sqlitedatabase)/files
SqliteDatabase db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + “/” + DBNAME,null);

//创建person表
db.execSQL(“create table person(_id integer primary key autoincrement, perName varchar(20) not null,perAge int check(perAge >= 0 and perAge <= 150))”);

5.下面通过使用SQL语句来操作Sqlite数据库

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.itrealman.contentprovide.MainActivity">

    <TextView
        android:id="@+id/mTvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="请输入姓名:"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/mEdtName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mTvName"
        android:layout_marginTop="10dp" />

    <TextView
        android:id="@+id/mTvAge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mEdtName"
        android:layout_marginTop="20dp"
        android:text="请输入年龄:"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/mEdtAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mTvAge"
        android:layout_marginTop="10dp" />

    <LinearLayout
        android:id="@+id/mLin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mEdtAge"
        android:layout_marginTop="10dp"
        android:gravity="center">
        <Button
            android:id="@+id/mBtnCreate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="创建表" />

        <Button
            android:id="@+id/mBtnInsert"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="插入" />

        <Button
            android:id="@+id/mBtnDelete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="删除" />

        <Button
            android:id="@+id/mBtnUpdate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="更新" />

        <Button
            android:id="@+id/mBtnQuery"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查询" />

    </LinearLayout>

    <TextView
        android:id="@+id/mTvResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mLin"
        android:layout_marginTop="50dp"
        android:text="查询的数据为:"
        android:textSize="20sp" />
</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

        //数据库对象
        private SQLiteDatabase db;
        //数据库名
        public final String DBNAME = "test.db";
        //数据库表名
        public final String TABLENAME = "person";
        private EditText mEdtName;
        private EditText mEdtAge;
        private TextView mTvResult;
        private Button mBtnInsert;
        private Button mBtnDelete;
        private Button mBtnUpdate;
        private Button mBtnQuery;
        private Button mBtnCreate;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
            event();
            //创建person表

        }

        /**
         * 初始化事件
         */
        private void event() {
            mBtnDelete.setOnClickListener(this);
            mBtnInsert.setOnClickListener(this);
            mBtnUpdate.setOnClickListener(this);
            mBtnQuery.setOnClickListener(this);
            mBtnCreate.setOnClickListener(this);

        }

        /**
         * 初始化控件
         */
        private void init() {
            //创建数据库,如果该文件下不存在数据库就创建,存在就打开,
            //getFilesDir()获取的路径是:/data/data/对应你的包名(com.itrealman.sqlitedatabase)/files
            db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + "/" + DBNAME, null);
            mBtnInsert = (Button) findViewById(R.id.mBtnInsert);
            mBtnDelete = (Button) findViewById(R.id.mBtnDelete);
            mBtnUpdate = (Button) findViewById(R.id.mBtnUpdate);
            mBtnQuery = (Button) findViewById(R.id.mBtnQuery);
            mBtnCreate = (Button)findViewById(R.id.mBtnCreate);
            mEdtAge = (EditText) findViewById(R.id.mEdtAge);
            mEdtName = (EditText) findViewById(R.id.mEdtName);
            mTvResult = (TextView)findViewById(R.id.mTvResult);
        }

        @Override
        public void onClick(View v) {
            String name = null;
            int age = 0;
            switch (v.getId()) {
                case R.id.mBtnDelete:
                    name = mEdtName.getText().toString().trim();
                    deleteData(name);
                    break;
                case R.id.mBtnUpdate:
                    name = mEdtName.getText().toString().trim();
                    age = Integer.parseInt(mEdtAge.getText().toString().trim());
                    updateData("newName", age, name);
                    break;
                case R.id.mBtnInsert:
                    name = mEdtName.getText().toString().trim();
                    age = Integer.parseInt(mEdtAge.getText().toString().trim());
                    insertData(name, age);
                    break;
                case R.id.mBtnQuery:
                    queryAllData();
                    break;
                case R.id.mBtnCreate:
                    createTable();
                    break;
            }
        }

        /**
         * 插入数据
         * @param name
         * @param age
         */
        private void insertData(String name, int age) {
            db.execSQL("insert into " + TABLENAME + "(name,age) values(?,?)", new Object[]{name, age});
            Toast.makeText(this, "插入数据", Toast.LENGTH_SHORT).show();
        }

        /**
         * 删除数据
         * @param name
         */
        private void deleteData(String name) {
            db.execSQL("delete from " + TABLENAME + " where name =  ?", new Object[]{name});
            Toast.makeText(this, "删除数据", Toast.LENGTH_SHORT).show();
        }

        /**
         * 更新数据
         * @param name 更新数据的名字
         * @param age 更新数据年龄
         * @param name1 需要跟新的条件
         */
        private void updateData(String name, int age, String name1) {
            db.execSQL("update " + TABLENAME + " set name = ? ,age = ? where name = ?", new Object[]{name, age, name1});
            Toast.makeText(this, "更新数据", Toast.LENGTH_SHORT).show();
        }

        /**
         * 查询所有数据
         */
        private void queryAllData() {
            Cursor cursor = db.rawQuery("select * from " + TABLENAME,null);
            StringBuilder sb = new StringBuilder();
            sb.append("查询的数据为:");
            while (cursor.moveToNext()) {
                sb.append("name = " + cursor.getString(cursor.getColumnIndex("name"))).append("   age = " + cursor.getInt(cursor.getColumnIndex("age"))).append("    ");
            }
            mTvResult.setText(sb.toString());
        }

        /**
         * 创建表,如果表存在就不创建,这也是一个小细节,如果说不加if not exists语句,那么
         * 这个表就只能创建一次,后面的每次创建都会导致程序崩溃,加上这条语句后,起码创建
         * 表按钮不会导致程序崩溃
         */
        private void createTable(){
            db.execSQL("create table if not exists " + TABLENAME + "(_id integer primary key autoincrement, name varchar(20) not null,age int check(age >= 0 and age <= 150))");
            Toast.makeText(this,"创建表",Toast.LENGTH_SHORT).show();
        }
        /**
         * 每次结束程序时关闭数据库,防止内存泄露问题
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if(db != null){
                db.close();
            }
        }
        }

上面的代码都是采用都是使用SQL语句的形式对数据库操作的,也许对于初学者来说会觉得这些SQL语句写起来非常繁琐,一不小心SQL语句就写错了,但是作为一个程序员,这些基本的语句还是要掌握的。当然我们还有更方便的方法来对数据库进行操作,为了防止SQL语句一不留神就写错了,安卓直接为我们提供针对表名的形式进行增删改查操作,而通过这些方法,我们只需要传递对应的表名、查询条件、值、参数等。

注意,初次启动必须点击一次创建表按钮,或者为了方便起见,可以把创建表语句放到onCreate方法中,每次初始化时让其自动创建表即可。

配上效果图吧,只做了简单的操作 ,其他操作都一样,只是没做这些效果:

这里写图片描述

ps:对应上面的代码,是让初学者掌握基本的SqliteDatabase的操作,平时在安卓中都不会使用这些代码做基本操作,有关SqliteDatabase数据库的封装操作会在后面学习中讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值