Android SQL 学习记录

 

Android应用处理数据的方法

 

几种数据存储方式

a. SQLiteDB

在Android中我们使用SQLiteDB作为数据库,它具有以下特点:

  • Light : 轻量级
  • Standard : 标准化
  • Open-Src : 开源
  • No Server : 没有服务器
  • Single-tier : 单层的  
  • Loose-type : 宽松类型
  • App-process : 在应用程序的进程中进行调用

下面我们挑几个SQLiteDB的特性进行介绍。

Standard :SQLite是标准兼容的,也就是说SQL语句在SQLite均可使用

Single-tier :是指SQLite是单层的,也就是不含中间层,不需要通过什么工具访问数据库,可以直接访问。

No Server :SQLite是自包含的数据库,当你创建的数据库的时候,这些数据会保存在应用中的某一个文件中

Loose-type :简单来说就是同一列中的数据可以是不同类型

b. Internal Storage (内部存储)

用于存放应用程序的相关数据,在内部存储中,每个应用对应一个文件夹,并且每个文件之间不可相互访问,应用程序只能访问与之对应的文件。

c. External Storage(外部存储)

一般用于存放较大的文件,如图片、音频等,在外部存储中的文件,每个应用程序均可访问。

d. shared preferences (偏好设置)

用于存储用户的偏好信息,用key-value的形式存储

e. remote storage (网络存储)

  •  

SQLite文件

a. 存放路径:/data/data/<package-name>/databases

SQLite文件放置于Android根目录下的data/data中,以应用程序的名称作为包名的文件夹中

b. SQLite文件是私有的,也就是说,仅该程序可访问,而其他程序不可访问。

Tips : 一般较大的文件不能直接放在Database中,而应该将大文件的URL放在Database中。

c. 创建数据库

1. 使用代码的方式进行创建(code)

  • android.database.sqlite.SQLiteData      ---在代码中直接使用 
SQLiteDatabase sqlDB=openOrCreateDatabase("test.db",mode:SQLiteDatabase.CREATE_IF_NECESSARY,null)
sqlDB.execSQL("CREATE Table tb1(id INTERGER PRIMARY KEY, name TEXT,phone LONG)");
sqlDB.close();

       例如在上述代码中,我们首先创建一个SQLiteDatebase对象,并对数据库的name,mode以及factory进行赋值。

然后调用execSQL方法执行数据库语句来创建表。

               SQLiteDatabase的具体使用方法参考开发文档: 

                    https://developer.android.google.cn/reference/kotlin/android/database/sqlite/SQLiteDatabase?hl=en

  • SQLiteOpenHelper

android.database.sqlite.SQLiteData一般直接在Activity中就可直接使用,但是这样会导致代码的耦合度过高,为了降低掉吗的耦合度,我们采用SQLiteOpenHelper来进行数据库的相关操作。

值得注意的是,SQLiteOpenHelper是一个抽象类,因此我们在使用的使用需要实现该抽象类,具体的使用方法如下。

在这里我们为了更好的展示,将代码分为两个部分。

public class MainActivity extends AppCompatActivity {

    ...code...
    
    /*在OnCreate直接调用我们所实现的SQLiteOpenHelper类进行数据的插入
    (在这里我们将其命名为Datahelper)
    */
    @Override
    protected void onCreate() {

        Button bt1 =(Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener(){....});
        Datahelper dh = new DataHelper(); //创建我们实现的Datahelper对象
        dh.insert(te.text());  //假设有个名为te的控件,我们获取其中的text并通过Datahelper对象将其插入到数据库中
}
/*实现SQLiteOpenHelper抽象类*/

public class DataHelper{
    SQLiteDatabase sqlDB;  //创建一个数据库对象(在android.database.sqlite.SQLiteData部分我们已经做了介绍)
    OpenHelper oh;
    private final static String dataName; //定义数据库的名称
    public DataHelper(){
        oh = new OpenHelper(this.Context); //用于创建OpenHelper类对象,其中this.Context表示获取当前的上下文对象
        sqlDB = oh.getWritableDatabase(); //定义为可写的
    }

    insert() //实现数据库的插入方法
    {
        sqlDB.insert();
    }

    getTable() //实现数据库获取表的方法
    {
        SQLiteDatabase sqlDB = openorCreate
    }

    /*实现SQLiteHelper抽象类
        *实现SQLiteHelper类中的两个方法
        *onpenHelper方法
        *onCreate方法
    */

    private static class Openhelper extends SQLiteHelper 
    {
        public OpenHelper (Context context){
            super(context,dataName,.....);
        }

        void onCreate(SQLiteDatabase db){
            db.execSQL("create table...");
        }
    }
}

2. 使用Linux shell进行创建

  • 使用cmd命令打开adb.exe
  • 输入adb shell 进入android 的 linux 命令操作方式

  • 切换到应用对应的存放数据库的文件路径下(这里博主创建的项目为myapp)

  • 输入sqlite3  <database-name>   例如:sqlite3 test.db //即创建一个名为 test 的数据库

  • 接下来就可以进行创建表格插入数据等操作,在这里就不一一赘述了
  • 最后使用 exit 可退出Linux Shell

d. 存储/获取数据库中的信息

  • Insert,delete,Update

我们需要先创建一个数据库,根据上面的介绍,我们可以采用两种方式进行创建,由于上面已经给出了实现方法,在这里博主就不重复创建,直接用我们已经创建好的database进行增删改操作。

已有的数据库结构 :

  1. <database> - test.db   
  2. <table-name> - tb1
  3. <column-name> - name , phone

在Activity类中,我们用一个按钮来触发数据库的插入操作,下列这段代码放在OnCreate方法中。

        TextView tv = (TextView)  findViewById(R.id.text1);

        Button bt1 =(Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(){
                TextView tv = (TextView) findViewById(R.id.text1);
                tv.setText("INSERT");
                SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);
                sqlDB.execSQL("INSERT INTO tb1(name,phone) values('name1','123123123123')");
                sqlDB.close();
            }
        });

运行完程序,我们点击按钮后,重新回到命令行窗口,查找我们数据库中已有表tb1中的数据,发现该记录已经成功写入。

接下来我们来到Android开发文档中找到SQLiteDatabase中的insert方法。

可以发现 SQLiteDatabase的insert方法有三个参数,其中table表示表名,nullColumnHack表示当表的某行为空时用来代替的字符串,还有一个就是ContentValues,我们接着介绍一下它。

  • ContentValue(Android提供的一种数据类型) - 常用于Android中数据库的添加

我们在刚刚进行INSERT操作的方法中进行修改,用ContentValue的方式来实现

  1. 创建一个ContentValue对象
  2. 使用put方法,将对应输入的内容与每一列的名称对应起来
  3. 最后使用SQLiteDatabase中的 insertOrThrow 方法进行插入。

Tips:这里值得注意的是,insertOrThrow 方法如果插入时出现异常,该方法会抛出异常,因此我们需要将它写在 try-catch 代码块中,并在 catch 中将错误信息写入Android的Log中。

        TextView tv = (TextView)  findViewById(R.id.text1);

        Button bt1 =(Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(){
                TextView tv = (TextView) findViewById(R.id.text1);
                tv.setText("INSERT");
                SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
                ContentValues cv = new ContentValues();
                cv.put("name", "name2");
                cv.put("phone", 123123123123L);
                try {
                    sqlDB.insertOrThrow("tb1", null, cv);
                } catch (Exception e) {
                    Log.e("DBerror", e.getMessage());
                }
            }
        });

我们同样运行程序,触发该点击事件后 重新回到命令行窗口,查找我们数据库中已有表tb1中的数据,发现该记录已经成功写入。

  • Retrieve records from a table; (从表中获取记录)

         我们可以通过SQLiteDatabase中的query()方法来实现从表中获取记录

同样我们先看看在Android开发文档中是如何定义query方法的。

从文档中我们可以看到query方法具有多种调用方式,在这里我们选择第一种进行进一步的探讨。

  1. distinct :如果希望每行唯一,则为true;否则为false。
  2. table :要查询的表名。
  3. columns :要查询的列
  4. selection :声明要返回哪些行的筛选器,格式为sql where子句(不包括where本身)。传递null将返回给定表的所有行。
  5. limit :限制查询返回的行数,传递null表示没有限制。

Tips :值得注意的是,使用该方法返回的将会是一个Cursor(指针),接下来我们用query方法来实现数据库的查询。

       TextView tv = (TextView) findViewById(R.id.text1);

        Button bt1 = (Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                TextView tv = (TextView) findViewById(R.id.text1);
                tv.setText("Dial");

                try {
                    String[] fields = {"name"}; //查询的列名
                    Cursor c = sqlDB.query("tb1", fields, null, null, null, null, null, null);

                    /*将指针指向开头
                     *判断是否为空
                     *不为空则将查询的结果加入到TextView的文本中进行显示
                     *将指针移向下一位
                     */
                    if (c.moveToFirst()) {
                        while (c.isAfterLast() == false) {
                            tv.append(c.getString(0) + " ");
                            c.moveToNext();
                        }
                    }

                    /*如果指针不为空,则关闭该指针*/
                    if (c != null)
                        c.close();
                } catch (Exception e) {
                    Log.e("DBerror", e.getMessage());
                } finally {

                    /*关闭数据库*/
                    if (sqlDB != null)
                        sqlDB.close();
                }
            }
        });

结果展示:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章