Android学习:利用SQLite数据库存储数据

1、SQLite简介

        SQLite是一款轻量级的关系型数据库,他支持SQL语言。由于它占用的资源非常少,利用很少的内存就有很好的性能,所以很多嵌入式设备都使用SQLite来存储数据。它支持windows、Linux以及UNIX等主流的操作系统,兼容性好。可以使用java、C#和PHP等多种开发语言,通过ODBC接口操作SQLite。

        目前的一些主流移动操作系统(如Android和IOS等),都在使用SQLite作为复杂数据的存储引擎。

2、SQLite的数据类型

        一般数据库采用的是固定的静态数据类型,而SQLite采用的是动态数据类型,它会根据输入的数值自动判断并存储。SQLite具有以下五种数据类型。

        NULL:空值;

        INTEEGER: 带符号的整型,具体取决于存入数字的范围大小;

        REAL:浮点数字,存储为8-byte IEEE浮点数;

        TEXT:字符串文本;

        BLOB:二进制对象。

        实际上,SQLite3也支持smallint、integer、float、decimal、double、varchar、date以及time等数据类型。

3、SQLite的基本用法

1.创建或打开数据库

        当需要创建或打开一个数据库并获得数据库对象时,首先根据指定的文件名,利用SQLiteOpenHelper类创建一个辅助对象,并调用该对象的getWritableDatabase()方法或者getReadableDatabase()方法来获得一个SQLiteDatabase对象,此时才创建或者打开了一个数据库。

        创建或者打开一个数据库的基本语法如下:

 //创建StudentsDBHelper对象
 StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"stdentDB",null,1);
            //得到一个可读的SQLiteDatabase对象
 SQLiteDatabase db = dbHelper.getReadableDatabase();

2.关闭数据库

        使用完数据库后,应该及时将其关闭,以便释放其所占的系统资源。Android系统利用SQLiteOpenHelper类的close()方法关闭打开的数据库。

3.创建或删除表

        创建数据库的一个表的基本方法是:编写创建表(create table)或删除表(drop table)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法来执行该SQL语句。

4.插入数据

        向表中插入数据有以下两种方法。

        方法1:利用SQLiteDatabase类的insert(String table,String nullColumnHack,ContentValues values)方法。

        其中,各参数的意义如下:

        table:表名称。

        nullColumnHack:空列的默认值。

        values:ContentValues类型的键值对Key-Values。

        方法2:编写插入数据(insert)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法执行该SQL语句。

5.删除语句

        删除表中的数据有以下两种方法。

        方法1:利用SQLiteDatabase类的delete(String table,String whereClause,String【】 whereArgs)方法。

        其中,各参数的意义如下:

        table:表名称。

        whereClause:删除条件。

        whereArgs:删除条件值数组。

        方法2:编写删除数据(delete)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法来执行该SQL语句。

6.修改数据

        修改表中的数据有以下两种方法。

        方法1:利用SQLiteDatabase类的update(String table,ContentValues values,String whereClause,String【】 whereArgs)方法。

        其中,各参数的意义如下:

        table:表名称。

        values:ContentValues类型的键值对Key-Values。

        whereClause:更新条件(where子句)。

        whereArgs:更新条件数据。

        方法2:编写更新数据(update)的SQL语句,然后调用SQLiteDatabase类的execSQL()方法来执行该SQL语句。

7.查询数据

        查询表中的数据有以下两种常用的方法。

        方法1:在Android中查询数据可以通过Cursor类实现。当使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向每一条数据,提供了很多有关查询的方法,常用的方法是 public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)。

        其中,各参数的意义如下:

        table:表名称。

        columns:列名称数组。

        selection:条件子句,相当于where。

        selectionArgs:条件子句,参数数组。

        groupBy:分组列。

        having:分组条件。

        orderBy:排序列。

        limit:分页查询限制。

        Cursor:返回值,相当于结果集ResultSet。

【说明】对于不使用的参数,可以将将他们设置为NULL。

        Cursor是一个游标接口,提供了遍历查询结果的方法,例如,移动指针方法move()、获得列值方法getString()等。

        方法2:同样通过Cursor类,利用db.rawQuery(String sql,String[] selectionArgs)方法。

        其中,各参数的意义如下:

        sql:查询(select)的SQL条件子句。

        selectionArgs:条件子句,参数数组。

示例:

        开发一个Android应用程序,通过单击相应按钮,创建一个SQLite数据库,用来保存学生的“姓名”、“年龄”和“入学日期”这3个字段数据,并且还可以实现数据库的增加、删除、修改和查询等基本功能。

XML布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:columnCount="4"
    tools:context="zut.edu.e13_4.MainActivity">
​
​
    <TextView
        android:id="@+id/textView1"
        android:layout_row="1"
        android:layout_column="0"
        android:layout_gravity="right"
        android:text="姓名:"
        android:textColor="@android:color/black"/>
    <EditText
        android:id="@+id/name"
        android:layout_columnSpan="2"
        android:ems="6"/>
    <TextView
        android:id="@+id/textView2"
        android:layout_column="0"
        android:layout_gravity="right"
        android:text="年龄:"
        android:textColor="@android:color/black"/>
    <EditText
        android:id="@+id/age"
        android:layout_columnSpan="2"
        android:ems="6"/>
    <TextView
        android:id="@+id/textView3"
        android:layout_column="0"
        android:layout_gravity="right"
        android:text="入学时间:"
        android:textColor="@android:color/black"/>
    <EditText
        android:id="@+id/enrol"
        android:layout_columnSpan="2"
        android:ems="6"/>
    <Button
        android:id="@+id/previous"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_column="1"
        android:text="&lt;上一条"/>
    <Button
        android:id="@+id/next"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_column="2"
        android:text="下一条>"/>
    <Button
        android:id="@+id/insert"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_row="5"
        android:layout_column="0"
        android:text="插入"/>
    <Button
        android:id="@+id/update"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="更新"/>
    <Button
        android:id="@+id/query"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="查询"/>
    <Button
        android:id="@+id/delete"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="删除"/>
    <Button
        android:id="@+id/createDatabase"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_row="6"
        android:layout_column="1"
        android:layout_columnSpan="2"
        android:layout_gravity="center"
        android:text="创建数据库"/>
</GridLayout>
​

另外 在包含MainActivity.java的包里面新建一个StudentsDBHelper类。

其中该类的具体代码如下:

​
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
​
/**
 * Created by 86166 on 2022/5/9.
 */
​
public class StundentsDBHelper extends SQLiteOpenHelper {
​
    private static final String TAG = "studentDB";
​
    //必要构造参数
    public StundentsDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
​
    //第一次创建数据库时调用该方法
    public void onCreate(SQLiteDatabase db){
        //创建新表
        String sql = "create table student_table(TxtName TEXT,IntAge INTEGER,TxtEnrol TEXT)";
        db.execSQL(sql);
        //输出创建数据库的日志信息
        Log.i(TAG,"create Database OK!");
    }
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG,"update Database OK!");
​
    }
}
​

打开MainActivity.java,编写相应的代码:

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
​
public class MainActivity extends Activity {
    //定义各种控件对象
    private Button createBtn;
    private Button insertBtn;
    private Button updateBtn;
    private Button queryBtn;
    private Button deleteBtn;
    private Button previousBtn;
    private Button nextBtn;
    private EditText nameEdt;
    private EditText ageEdt;
    private EditText enrolEdt;
    //定义对应的参数
    private Cursor cursor;
    private String name,age,enrol;
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得各控件对象;
        createBtn = (Button)findViewById(R.id.createDatabase);
        insertBtn = (Button)findViewById(R.id.insert);
        updateBtn = (Button)findViewById(R.id.update);
        queryBtn = (Button)findViewById(R.id.query);
        deleteBtn = (Button)findViewById(R.id.delete);
        previousBtn = (Button)findViewById(R.id.previous);
        nextBtn = (Button)findViewById(R.id.next);
        nameEdt = (EditText)findViewById(R.id.name);
        ageEdt = (EditText)findViewById(R.id.age);
        enrolEdt = (EditText) findViewById(R.id.enrol);
        //为按钮注册监听器
        createBtn.setOnClickListener(new CreateListener());
        deleteBtn.setOnClickListener(new DeleteListener());
        queryBtn.setOnClickListener(new QueryListener());
        updateBtn.setOnClickListener(new ModifyListener());
        insertBtn.setOnClickListener(new InsertListener());
        nextBtn.setOnClickListener(new NextListener());
        previousBtn.setOnClickListener(new PreviousListener());
​
    }
    //创建数据库
    class CreateListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            //创建StudentsDBHelper对象
            StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"stdentDB",null,1);
            //得到一个可读的SQLiteDatabase对象
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            Toast.makeText(MainActivity.this,"数据库创建成功。",Toast.LENGTH_LONG).show();
        }
    }
    //插入数据
    class InsertListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            try{
                StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
                //得到一个可写的数据库对象
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                //生成ContentValues对象(key:列名,value:要插入的值)
                ContentValues cv = new ContentValues();
                //向ContentValues对象中存放数据(键—值对)
                cv.put("TxtName",nameEdt.getText().toString());
                cv.put("IntAge",ageEdt.getText().toString());
                cv.put("TxtEnrol",enrolEdt.getText().toString());
                //将数据插入表
                db.insert("student_table",null,cv);
                //关闭数据库
                db.close();
                Toast.makeText(MainActivity.this,"插入数据成功。",Toast.LENGTH_LONG).show();
            }catch (SQLException e){
                Toast.makeText(MainActivity.this,"插入数据失败.",Toast.LENGTH_LONG).show();
            }
        }
    }
    //查询数据
    class QueryListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
            //获得一个可读的数据库
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            cursor = db.rawQuery("SELECT * FROM student_table WHERE TxtName=?",new String[]{nameEdt.getText().toString()});
            //如果有查询结果,则移动游标到第一条记录
            if(cursor.getCount()>0){
                cursor.moveToFirst();
                name = cursor.getString(cursor.getColumnIndex("TxtName"));
                nameEdt.setText(name);
                age = cursor.getString(cursor.getColumnIndex("IntAge"));
                ageEdt.setText(age);
                enrol = cursor.getString(cursor.getColumnIndex("TxtEnrol"));
                enrolEdt.setText(enrol);
            }else {
                Toast.makeText(MainActivity.this,"没有满足条件的数据。",Toast.LENGTH_LONG).show();
            }
            //关闭数据库
            db.close();
        }
    }
    //修改数据
    class ModifyListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
            //得到一个可写的数据库对象
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            //定义一个ContentValeus对象
            ContentValues cv = new ContentValues();
            cv.put("IntAge",ageEdt.getText().toString());
            cv.put("TxtEnrol",enrolEdt.getText().toString());
            //where子句
            String whereClause="TxtName=?";
            //where子句的条件
            String [] whereArgs = {String.valueOf(nameEdt.getText())};
            db.update("student_table",cv,whereClause,whereArgs);
            //关闭数据库
            db.close();
            Toast.makeText(MainActivity.this,"修改数据成功。",Toast.LENGTH_LONG).show();
​
        }
    }
    //删除数据
    class DeleteListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            StundentsDBHelper dbHelper = new StundentsDBHelper(MainActivity.this,"studentDB",null,1);
            //得到一个可写的数据库对象
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            String whereClauses = "TxtName = ?";
            String []  whereArgs = {String.valueOf(nameEdt.getText())};
            //删除数据
            db.delete("student_table",whereClauses,whereArgs);
            nameEdt.setText("");
            ageEdt.setText("");
            enrolEdt.setText("");
            db.close();
            Toast.makeText(MainActivity.this,"删除数据成功。",Toast.LENGTH_LONG).show();
​
        }
    }
    //上一条数据
    class PreviousListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            if(!cursor.isFirst()){
                cursor.moveToFirst();
                name = cursor.getString(cursor.getColumnIndex("TxtName"));
                nameEdt.setText(name);
                age = cursor.getString(cursor.getColumnIndex("IntAge"));
                ageEdt.setText(age);
                enrol = cursor.getString(cursor.getColumnIndex("TxtEnrol"));
                enrolEdt.setText(enrol);
            }
        }
    }
    //下一条数据
    class NextListener implements View.OnClickListener{
        @Override
        public void onClick(View v){
            if(!cursor.isLast()){
                cursor.moveToNext();
                name = cursor.getString(cursor.getColumnIndex("TxtName"));
                nameEdt.setText(name);
                age = cursor.getString(cursor.getColumnIndex("IntAge"));
                ageEdt.setText(age);
                enrol = cursor.getString(cursor.getColumnIndex("TxtEnrol"));
                enrolEdt.setText(enrol);
            }
        }
    }
​
}
​

猜你喜欢

转载自blog.csdn.net/weixin_52021660/article/details/124754380