加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

sqlite应用1

发布时间:2020-12-12 19:24:47 所属栏目:百科 来源:网络整理
导读:SQLite是一款轻量级的关系型数据库,它的运行速度很快,占用资源少,通常只需要几百K的内存就足够了,因而现在的主流移动设备都使用SQLite作为复杂数据的存储引擎。对于Android来说,系统内置了丰富的API来提供开发人员操作SQLite,从而轻松的实现数据的操作

SQLite是一款轻量级的关系型数据库,它的运行速度很快,占用资源少,通常只需要几百K的内存就足够了,因而现在的主流移动设备都使用SQLite作为复杂数据的存储引擎。对于Android来说,系统内置了丰富的API来提供开发人员操作SQLite,从而轻松的实现数据的操作。

创建数据库

SQLite 数据类型

integer — 整型 real—浮点型 text—文本类型 blob—二进制类型

新建一个类MyDatabaseHelper 继承自SQLiteOpenHelper (Android为我们专门提供的一个帮助类)

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + //primary key 将id列设为主键 autoincrement表示id列是自增长的 "id integer primary key autoincrement," + "author text,0)">"price real,0)">"name text)"; private Context mContext; //构造方法:第一个参数Context,第二个参数数据库名,第三个参数cursor允许我们在查询数据的时候返回一个自定义的光标位置,一般传入的都是null,第四个参数表示目前库的版本号(用于对库进行升级) public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); mContext = context; } @Override void onCreate(SQLiteDatabase db) { //调用SQLiteDatabase中的execSQL()执行建表语句。 db.execSQL(CREATE_BOOK); //创建成功 Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show(); } void onUpgrade(SQLiteDatabase db,136)">int oldVersion,136)">int newVersion) { } }

更改studio 生成的自动布局文件(activity_main.xml)

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=android:orientation="vertical" tools:context="com.example.scott.sqlitetest.MainActivity"> Button "wrap_content" android:id="@+id/create_database" android:text="Create database"/> </LinearLayout>

    修改MainActivity中的代码:

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • MainActivity AppCompatActivity { private MyDatabaseHelper dbHelper; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this,0)">"BookStore.db",136)">null,1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override void onClick(View v) { //创建或打开现有的数据库 dbHelper.getWritableDatabase(); } }); } }

    SQLiteOpenHelper中的两个非常重要的实例方法。getReadableDatabase()和getWriteableDatabase(),这两个方法都可以创建和打开一个现有的数据库,区别在于当数据库不可写入的时候getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWriteDatabase()将出现异常

    到这里我们的数据库已经创建完成了运行效果如图:

    如图当我们第一次点击create database的时候会弹出Toast消息,,再次点击的时候就不会出现了说明没有运行oncreate 数据库已经创建完成了。
    那怎么才能找到这个文件呢???
    我电脑是windows 10 需要先配置环境变量
    如图我们只要在系统变量中选择path单击编辑 然后选择新建,目录为你android SDK 中platform-tools 平台工具的文件夹配置好后我们就可以使用文件夹中的adb工具和sqlite3 工具了

    使用adb 工具

    首先输入adb shell进入到设备控制台。
    然后使用cd 命令进行到/data/data/com.example.scott.sqlitetest/databases/目录下用 ls 命令查看该目录里的文件; 然后借助sqlite命令打开数据库,使用.table查看数据库中有哪些表,(android_metadata 是每个数据库都会自动生成的),使用.schema查看建表语句。最后输入.exit.quit 退出。

    升级数据库

    数据库升级其实很简单,我们只要更改SQLiteOpenHelper中构造方法的第四个参数,即当前数据的版本号,只要比之前传入的数值大就可以了。
    现在我想在之前的数据库中加上一列为Category 来记录书籍的分类。
    继续在MyDatabaseHelper 类中添加一条建表语句:

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • ...... final String CREATE_CATEGORY = "create table Category (" + "category_name text,0)">"category_code integer)"; ...... void onCreate(SQLiteDatabase db) { //调用SQLiteDatabase中的execSQL()执行建表语句。 db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext,Toast.LENGTH_SHORT).show(); } ...... int newVersion) { //如果Book、Category表已存在则删除表 db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); }

    设置好MyDatabaseHelper类之后,我们就可以在MainActivity中将版本号改为2 即( dbHelper = new MyDatabaseHelper(this,“BookStore.db”,null,2);),就可以对数据库进行升级了。

    与上一节一样查看数据库是否创建正确。如图

    我们可以看到数据库是实现了升级;
    注意图中红色标记区域是因为我电脑上开了虚拟机,然后手机又是调试状态。一般情况下我都是使用真机调试


    到这里我们的数据库建完了,还没有向表中添加数据。但是我们仔细看上面的数据库的的升级的时候可能发现一个问题,在升级的时候会将之前的表删除掉,那么之前表中保存的数据也会一并删除掉,造成以前程序存储在本地的数据全部丢失。那么怎样才能在升级数据库的时候不删除之前的表呢,我会在下一篇博文(Android Studio SQLite数据库应用(二))中写 SQLite事务处理的时候一并写一下。数据库升级的最佳写法

    CRUD数据操作

    CRUD—C (create) R(retrieve ) U(update) D(delete)

    添加数据

    先看代码:
    在布局文件中加一个按键:

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/add_data" android:text="Add Data"/>

    修改MainActivity 如下:

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • void onClick(View v) { dbHelper.getWritableDatabase(); } }); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(//getWritableDatabase()会返回一个SQLiteDatabase对象 SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name",0)">"The Da Vinci Code"); values.put("price",102)">20); values.put("pages",102)">600); values.put("author",0)">"Scott"); //insert()方法中第一个参数是表名,第二个参数是表示给表中未指定数据的自动赋值为NULL。第三个参数是一个ContentValues对象 db.insert("Book",values); values.clear(); values.put("The Lost Symbol"); values.put("Scott"); values.put(500); values.put(30); db.insert( 在上面的代码中只对Book表中的四列数据进行了组装,id那一列并没有给它赋值,因为在之前将id列设置为自增长了。
    接下来我们来看看表中是不是真的有数据。

    输入 select * from Book;查询表中的内容,在我没有按 Add Create 的时候 显示为空,按了之后,表中有了数据。

    更新数据

    SQLitedatabase 提供了update()用于数据的更新。

    在activity_main.xml 增加一个按键,这里就不写了。在MainActivity中怎么按键监听 ,用于数据更新。

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • Button updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = 19.99); //仔细update中提示的参数(String table,ContentValues,String whereClause,String[] whereArgs) //第三滴四行指定具体更新那几行。注意第三个参数中的?是一个占位符,通过第四个参数为第三个参数中占位符指定相应的内容。 db.update("name=?",136)">new String[]{"The Da Vinci Code"}); } });

    OK 更新成功。

    删除数据

    删除数据很简单,SQLiteDatabase 提供了delete() 方法用于删除数据。这里就不写代码了具体讲一下什么意思
    delete(String table,String [] whereArgs)

    举个例子 delete(“Book”,”name=?”,new String[] {“The Da Vinci Code”});
    就是把名字为The Da Vinci Code 这本书的数据都删除。
    再比如:delete(“Book”,”price > ?”,new String[] {“20”});
    意思就是把价格大于20 的所有的书都删掉。
    哈哈还是很好玩的,想删什么删什么,但是要注意了 如果你第二,第三个参数不指定的话,就会删除所有行。

    查询数据

    对于SQLite的查询功能这边我只简单介绍一下,因为前面的“增删减”只是SQLite 功能的一小部分。我想后面单独详细介绍一下SQLite的查询功能。

    同样,SQLiteDatabase 中提供了 query()方法用于对数据进行查询。
    方法中的参数:
    query(String table,String [] columns,String selection,String [] selectionArgs,String groupBy,String having,String orderBy );
    table —指定查询的表名
    columns —指定查询的列名
    selection —指定where的约束条件
    selectionArgs — 为where中的占位符提供具体的值
    groupBy — 指定需要 groupBy 的列
    having — 对groupBy后的结果进一步约束
    orderBy — 指定查询结果的排序方式

      
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • Button queryButton = (Button) findViewById(R.id.query_data); queryButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); //指明去查询Book表。 Cursor cursor = db.query(; //调用moveToFirst()将数据指针移动到第一行的位置。 if (cursor.moveToFirst()){ do { //然后通过Cursor的getColumnIndex()获取某一列中所对应的位置的索引 String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor"author")); int pages = cursor.getInt(cursor"pages")); double price = cursor.getDouble(cursor"price")); Log.d("MainActivity",0)">"book name is "+name)"book author is "+author)"book pages is "+pages)"book price is "+price); }while(cursor.moveToNext()); } cursor.close(); } });

    结果如图:

    好了到这里就结束了,下一篇 写数据库的事务处理,还有那什么 数据库升级的最佳方式。。。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读