android mysql sqlite_Android SQLite数据库基本操作方法

程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一些需求的吧,仍然以一个小例子开始:

在创建Android项目之前,我们应该想一下我们要定义的数据库的相关信息和里面的表格的相关信息,为了日后数据库的更新更加方便 ,我们可以用一个专门的类保存数据库的相关信息,以后如果要更新数据库的话只需要该动这个类就行了。这样使得日后的操作更加方便。

新建一个Android工程:

在Src文件夹下新建一个包com.example.databaseHelper:

在这个包中创建两个类,首先我们来看第一个类DatabaseStatic.Java:

package com.example.databaseHelper;

public class DatabaseStatic {

public final static String DATABASE_NAME = "BookStore.db";

public final static int DATABASE_VERSION = 1;

public final static String TABLE_NAME = "book";

public final static String BOOK_NAME = "bookName";

public final static String ID = "_id";

public final static String AUTHOR = "author";

public final static String PRICE = "price";

public final static String DATE = "sellData";

}

这个类中定义了数据库名称、版本、还有里面有一个名为“book”的表的相关信息,实现我们上面的意图,接下来是这个包里面的另外一个类MyHelper.java:

package com.example.databaseHelper;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

import android.widget.Toast;

/*

* 在这个类的构造函数里面我们调用了父类的构造方法用来创建数据库文

* 件,第二个构造方法只是为了方便构造(不用些那么多的参数)

* 这个类继承了 SQLiteOpenHelper 类,并且重写了父类里面的

onCreate方法和 onUpgrade方法,

* onCreate方法当数据库文件不存在的时候会被调用来创建一个新的数

* 据库文件(不懂的小伙伴可以百度一下)

*/

public class MyHelper extends SQLiteOpenHelper{

public static String CREATE_TABLE = "create table "+ DatabaseStatic.TABLE_NAME +"(" +

DatabaseStatic.BOOK_NAME + " varchar(30), " +

DatabaseStatic.ID + " Integer primary key autoincrement, " +

DatabaseStatic.AUTHOR + " varchar(20) not null, " +

DatabaseStatic.PRICE + " real)"; // 用于创建表的SQL语句

private Context myContext = null;

public MyHelper(Context context, String name,

CursorFactory factory, int version) {

super(context, DatabaseStatic.DATABASE_NAME, null, DatabaseStatic.DATABASE_VERSION);

}

public MyHelper(Context context)

{

super(context, DatabaseStatic.DATABASE_NAME, null, DatabaseStatic.DATABASE_VERSION);

myContext = context;

}

@Override

public void onCreate(SQLiteDatabase db) {

Log.i("UseDatabase", "创建数据库");

Toast.makeText(myContext, "创建数据库", Toast.LENGTH_SHORT).show();

db.execSQL(CREATE_TABLE);

}

@Override

public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

}

}

当要获取数据库对象时(通过SQLiteOPenHelper中自带的方法getWriteableDatabase或者getReadableDatabase),如果数据库文件不存在,这个类里面的onCreate方法会被调用来创建一个新的数据库文件,如果数据库文件已经存在,那么onCreate方法将不会被调用

activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/mainLayout"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:gravity="center_horizontal"

tools:context=".MainActivity" >

android:id="@+id/buttonCreateDatabase"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="创建数据库" />

android:id="@+id/buttonInsertDatabase"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="插入数据"/>

android:id="@+id/buttonUpdateDatabase"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="更新数据"/>

android:id="@+id/buttonDeleteDatabase"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="删除数据"/>

android:id="@+id/buttonQueryDatabase"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="显示数据库中 Book表中的所有数据"/>

一段布局代码,主要是5个按钮对应5中对数据库的操作:创建数据库、插入数据、更新数据、删除数据、显示(查询)数据。

那么最后是MainActivity.java:

import com.example.databaseHelper.DatabaseStatic;

import com.example.databaseHelper.MyHelper;

import android.os.Bundle;

import android.app.Activity;

import android.content.ContentValues;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.graphics.Color;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity {

private MyHelper myHelper = null;

private Button button = null;

private SQLiteDatabase database = null;

private static int bookSum = 0;

TextView textView = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = new TextView(this);

LinearLayout layout = (LinearLayout) findViewById(R.id.mainLayout);

layout.addView(textView);

button = (Button) findViewById(R.id.buttonCreateDatabase);

button.setOnClickListener(listener);

button = (Button) findViewById(R.id.buttonInsertDatabase);

button.setOnClickListener(listener);

button = (Button) findViewById(R.id.buttonUpdateDatabase);

button.setOnClickListener(listener);

button = (Button) findViewById(R.id.buttonDeleteDatabase);

button.setOnClickListener(listener);

button = (Button) findViewById(R.id.buttonQueryDatabase);

button.setOnClickListener(listener);

}

private View.OnClickListener listener = new View.OnClickListener() {

@Override

public void onClick(View v) {

switch(v.getId())

{

case R.id.buttonCreateDatabase:

createDatabase();

break;

case R.id.buttonInsertDatabase:

insertDatabase();

break;

case R.id.buttonUpdateDatabase:

updateDatabase();

break;

case R.id.buttonDeleteDatabase:

deleteDatabase();

break;

case R.id.buttonQueryDatabase:

searchDatabase();

break;

}

}

};

private void createDatabase() // 创建或者打开数据库

{

myHelper = new MyHelper(this);

/*

* 调用getWritabelDatabase方法或者

* getReadableDatabase方法时,如果数据库文

* 件中不存在(注意一个数据库中可以存在多个表格),

* 那么会回调MyHelper类的onCreate方法新建一个数据库文

* 件并且在这个数据库文件中新建一

* 个book表格

*/

myHelper.getWritableDatabase();

}

private void insertDatabase() // 向数据库中插入新数据

{

if(myHelper == null)

{

myHelper = new MyHelper(this);

}

database = myHelper.getWritableDatabase();

ContentValues cV = new ContentValues();

cV.put(DatabaseStatic.BOOK_NAME, "C Language");

cV.put(DatabaseStatic.ID, ++bookSum);

cV.put(DatabaseStatic.AUTHOR, "zhidian");

cV.put(DatabaseStatic.PRICE, 42.6);

/*

* 这个方法是留给不熟悉SQL语句的小伙伴用的,Android把

* SQLite的插入语句封装了起来,

* 通过 ContentValues 类的对象来保存数据库中的数据,

* 于HashMap

*/

database.insert(DatabaseStatic.TABLE_NAME, null, cV);

/*

* 对应的SQL语句:

* database.execSQL("insert into " + DatabaseStatic.TABLENAME + " values(?, ?, ?, ?)",

* new Object[]{"C Language", ++bookSum, "zhidian", 42.6});

* 或者是这个:

* database.execSQL("insert into " + DatabaseStatic.TABLENAME + "(" +

* DatabaseStatic.BOOKNAME + ", " + DatabaseStatic.ID + ", " +

* DatabaseStatic.AUTHOR + ", " + DatabaseStatic.PRICE +

* ") values(?, ?, ?, ?)", new Object[]{"C Language", ++bookSum, "zhidian", 42.6});

* 这里将 ? 号理解成一个C语言里面的占位符,然后通过 Object[] 数组中的内容补全,下同

* 参数中的 Object[] 数组是一个通用的数组,里面的数据可以转换为任意类型的数据,通过这个完成不同数据类型变量之间的储存

*/

Toast.makeText(this, "插入数据成功", Toast.LENGTH_SHORT).show();

}

private void updateDatabase() // 更新数据

{

if(myHelper == null)

{

myHelper = new MyHelper(this);

}

database = myHelper.getWritableDatabase();

ContentValues cV = new ContentValues();

cV.put(DatabaseStatic.AUTHOR, "xiaoming");

/*

* 调用 update 方法,将书名为"C Language" 的书作者更新为 "xiaoming

*/

database.update(DatabaseStatic.TABLE_NAME, cV,

DatabaseStatic.BOOK_NAME + "= ?", new String[]{"C Language"});

/*

* 对应的SQL语句:

* database.execSQL("update " + DatabaseStatic.TABLENAME + " set " + DatabaseStatic.AUTHOR +

* "= ? where " + DatabaseStatic.BOOKNAME + " = ?", new String[]{"xiaoming", "C Language"});

*/

Toast.makeText(this, "数据更新成功", Toast.LENGTH_SHORT).show();

}

private void deleteDatabase() // 数据库中删除数据

{

if(myHelper == null)

{

myHelper = new MyHelper(this);

}

database = myHelper.getWritableDatabase();

/*

* 调用 delete 方法删除数据库中的数据

* 对应的SQL语句:

* database.execSQL("delete from " +

* DatabaseStatic.TABLE_NAME + " where " +

* DatabaseStatic.BOOK_NAME + " = ?", new

* String[]{"C Language"});

*/

database.delete(DatabaseStatic.TABLE_NAME, DatabaseStatic.BOOK_NAME + " = ? ",

new String[]{"C Language"});

Toast.makeText(this, "数据删除成功", Toast.LENGTH_SHORT).show();

}

private void searchDatabase() // 查询数据库中的数据

{

if(myHelper == null)

{

myHelper = new MyHelper(this);

}

database = myHelper.getWritableDatabase();

/*

* 调用database的query方法,第一个参数是要查询的表名,

* 后面的参数是一些查询的约束条件,对应于SQL语句的一些参

* 数, 这里全为null代表查询表格中所有的数据

* 查询的结果返回一个 Cursor对象

* 对应的SQL语句:

* Cursor cursor = database.rawQuery("select * from book", null);

*/

Cursor cursor = database.query(DatabaseStatic.TABLE_NAME, null, null, null, null, null, null);

StringBuilder str = new StringBuilder();

if(cursor.moveToFirst()) // 显示数据库的内容

{

for(; !cursor.isAfterLast(); cursor.moveToNext()) // 获取查询游标中的数据

{

str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.ID)) + " ");

str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.BOOK_NAME)) + " ");

str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.AUTHOR)) + " ");

str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.PRICE)) + "\n");

}

}

cursor.close(); // 记得关闭游标对象

if(str.toString().equals(""))

{

str.append("数据库为空!");

textView.setTextColor(Color.RED);

}

else

{

textView.setTextColor(Color.BLACK);

}

textView.setText(str.toString());

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

MainActivity.java里面主要是实现了5个按钮对应的操作

SQLiteDatabase 类里面提供了对数据库表格进行插入、更新、删除、查询 的对应API,用于给对SQL语句不熟悉的开发者使用,当然我们还可以调用这个类里面的 execSQL 方法来直接执行SQL语句中的插入、更改、删除操作,用rawQuery 方法来执行SQL语句的查询语句。

Ok,整个工程的项目视图(可能有些多余。。。):

dc9d00b797c0cb07605bc1f3eafb9f9a.png

好了,运行一下:

d30e884123fccbfb958ff362bc17189c.png

先点击“创建数据库”按钮:

程序中的数据库文件都储存在 /data/data//databases文件中

运行cmd(windows系统)运行abd调试工具(如果没有将adb.exe加入环境变量中则需要写出adb.exe的完整路径)

输入 adb shell

再输入 cd /data/data/com.example.UseDataBase/databases进入对应储存文件目录

再输入 ls 显示文件中的子文件目录,接下来我们就可以对数据库文件进行操作了:

输入 sqlite3 数据库名称, 就可以对数据库进行操作了:

输入 .table 来查看当前数据库文件中的表格目录, 结果如下:

af0a89b6fa58e3840060d34e41906976.png

我们可以看到我们要创建的表格确实存在,证明我们的代码确实创建了数据库文件和里面对应的表。

而我们注意到这里面还有另外一个android_metadata表,这个表是每个数据库文件都会自动生成的,不需要管。

接下来单击“插入数据”按钮:

之后 在控制台中输入 “select * from book;”,这个是查询数据库文件中的数据的SQL语句,不熟悉的小伙伴可以在网上查到一些教程

95fcd7cbce9e066af69f515e2f5775a4.png

我们可以看到我们确实在book这张表中成功的插入了一条新的数据。

接下来单击“更新数据”按钮:

a633877c59262ff0c36d2eb48bfc9635.png

Ok,确实把书名为“C Language”的书的作者改为了 “xiaowei”,继续单击“删除”按钮:

438e3a087dccba8fd5f2843f8a21d1a0.png

使用 “select * from”语句查询表中的所有数据,并没有看到有数据,我们再单击一下“显示数据库中book表中的所有数据”按钮:

3c5b7cb9dc6c420f5bb16b4b4ca8030f.png

这样看来,数据库中book表中的数据确实已经被我们删除了。

这里提一下SQLite数据库操作的时候主要用到的数据类型:

整形:Integer、字符数组:varchar(10)、浮点数:real、字符串文本:text。当然SQLite还有很多的操作和支持的数据类型。

最后给出一些常用的SQL语句:

1、创建数据库表:

create table 表名(参数1 数据类型 约数条件, 参数2 数据类型 约束条件…)

例:

create table person(_id Integer primary key autoincrement, name varchar(20), sex varchar(5) not null, age Integer)

2、插入数据:

insert into 表名(参数1, 参数2…) values(参数1的值, 参数2的值…)

或者:

insert into 表名 values(参数1的值, 参数2的值)

例:

insert into person(_id, name, sex, age) values(1, “指点”, “男”, 19)

insert into person values(1, “指点”, “男”, 19)

3、更新数据:

update 表名 set 参数1 = 值, 参数2 = 值… where 条件1 and 条件2 or 条件3…

更新符合条件的所有数据

where后面的条件用 “and” 或者 “or”连接

例:

update person set _id = 0, age = 18 where _id = 1 and age<>19 // “<>”符号代表“不等于”

4、删除数据:

delete from 表名 where 条件1 and 条件2 or 条件3…

删除符合条件的所有数据

例:

delete from person where _id > 0 and name = “指点”

前四个操作的SQL语句可用 execSQL 方法带入参数执行

5、查询数据:

select 参数1, 参数2… from 表名 where 条件1 and 条件2…

返回的是符合条件的所有的数据中的参数1、参数2…

例:

select _id, name, sex from person where name = “指点” or _id = 1

返回的是: 1、“指点”、“男”

注意查询操作的SQL语句要用 rawQuery方法执行,详见代码

Ok, 终于把SQLite 的基础操作总结完了。这里所说的只是SQLite操作的冰山一角,日后还得多多学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 元组遍历_Python中的for循环:元组、列表、字典的遍历和相互转化

Python for循环可以遍历任何序列的项目&#xff0c;如列表、字符串、元组、字典、集合等序列类型。语法&#xff1a;for循环的语法格式如下&#xff1a;for iterating_var in sequence:statements(s)流程图&#xff1a;animals"dog","cat","pig"…

玩转oracle 11g(30):ora-03135和plsql乱码问题

22. ORA-03135连接失去联系 如果应用程序时不时地报错“ORA-03135连接失去联系”&#xff0c; 该问题可能与sqlnet.ora设置参数SQLNET.EXPIRE_TIME 有关 在文件sqlnet.ora中&#xff0c;增加一行&#xff0c;单位分钟&#xff1a; SQLNET.EXPIRE_TIME &#xff1d; 10 23. Pls…

计算机论文搜索技巧【一】

如何搜素一个杂志里面的文章并下载&#xff1f;&#xff08;以FSE为例&#xff09; 1.在dblp搜索 FSE 点击相关链接 用google或 google scholar 跳转页面 2.找到类似 source Materials目录 点击查阅相关文档 找到相关信息 3.复制题目&#xff0c;结合dblp与 google scholar找到…

[众包]Eclipse 运行简单亚马逊AMT模板

教程 1.打开esclipe下载AMT 输入 https://aws.amazon.com/eclipse 下载后需要重启 需要自己在亚马逊先注册 填入分配的信息 注册教程 &#xff08;需要信用卡 激活 创建账号 &#xff09; https://docs.aws.amazon.com/zh_cn/AWSMechTurk/latest/AWSMechanicalTurkGetting…

jmap 文件解析_干货分享丨jvm系列:dump文件深度分析

摘要&#xff1a;java内存dump是jvm运行时内存的一份快照&#xff0c;利用它可以分析是否存在内存浪费&#xff0c;可以检查内存管理是否合理&#xff0c;当发生OOM的时候&#xff0c;可以找出问题的原因。那么dump文件的内容是什么样的呢&#xff1f;JVM dumpjava内存dump是jv…

GAN 的推导、证明与实现。

转自机器之心整理的&#xff0c;来自Goodfellow 在 NIPS 2016 的演讲和台大李弘毅的解释&#xff0c;完成原 GAN 的推导、证明与实现。 本文主要分四部分&#xff0c;第一部分描述 GAN 的直观概念&#xff0c;第二部分描述概念与优化的形式化表达&#xff0c;第三部分将对 GAN …

玩转oracle 11g(32):plsql版本低需到配置文件中添加配置

1创建了一个数据库geyao&#xff0c;但是只能显示docare 2plsql版本太低&#xff0c;或者直接修改 C:\app\MDSD\product\11.2.0\dbhome_2\NETWORK\ADMIN 添加配置文件 出现歌谣

[测试智能合约]ganache+metamask+remix

1.谷歌浏览器 下载metamask 2.设置metamask 增加一个7545端口的网络 3.导入账户 从ganache的accounts里面随便找个账户的私钥传进去 4.打开remix 修改environment 5.写好的智能合约编译 remix经常抽风 疯狂来回切换版本号或者换网络 6.黄色按钮Deploy 7.同一页面最下方 打开部署…

Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence

使用Newtonsoft.Json反序列化收到的字串为JObject或其它支持的数据模型&#xff0c;有时错误&#xff0c;提示如下&#xff1a; Bad JSON escape sequence: \c. Path idno, line 5, position 34. 甚纳闷之。遂搜索资料&#xff0c;略有小获&#xff0c;其非法分界符所致。合法的…

玩转oracle 11g(33):无监听程序

故意操作删除监听 直接配置监听即可

mysql安装条款_mysql 安装注意

mysql 远程连接赋予权限&#xff1a;GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY datech WITH GRANT OPTION;FLUSH PRIVILEGES;MySQL 5.1采用了基于密码混编算法的鉴定协议&#xff0c;它与早期客户端(4.1之前)使用的协议不兼容。如果你将服务器升级到4.1之上&#xf…

java学习(126):throw向上抛出异常

//throw抛出异常 import java.util.Scanner; public class test66{static class A {void d() throws Exception {int a, b, c;Scanner in new Scanner(System.in);System.out.println("亲输入a的值");a in.nextInt();System.out.println("请输入b的值");…

[Java]集合的小抄 Java初学者必备

文章目录【背景】CollectionsListArrayList优势操作劣势操作LinkedList优势劣势最基本的两种检索集合中的所有对象的方法&#xff1a;CopyOnWriteArrayList补充说明StackMapMap 的常用方法&#xff1a;HashMapLinkedHashMapTreeMapConcurrentHashMapConcurrentSkipListMap补充说…

git之项目上传

git之项目上传 需求&#xff1a;将项目代码上传至github 前期准备&#xff1a; 1.github账号注册 2.安装git环境&#xff0c;可以打开且使用git shell. 3.生成SSH key并与github账号绑定 步骤&#xff1a; 1.进入gitshell 2. 进入到项目指定的目录下&#xff0c;适用git命令初始…

玩转oracle 11g(36):rman备份-控制文件丢失恢复

ORA-00205: error in identifying control file, check alert log for more info 检查oracle的报警日志包含类似报错&#xff1a; ORA-00210: cannot open the specified control file ORA-00202: control file: D:\ORACLE\PRODUCT\10.2.0\ORADATA\DOCARE\C ONTROL01.CTL OR…

[Leedcode][JAVA]第[945]题

【问题描述】 给定整数数组 A&#xff0c;每次 move 操作将会选择任意 A[i]&#xff0c;并将其递增 1。返回使 A 中的每个值都是唯一的最少操作次数。示例 1:输入&#xff1a;[1,2,2] 输出&#xff1a;1 解释&#xff1a;经过一次 move 操作&#xff0c;数组将变为 [1, 2, 3]。…

玩转oracle 11g(37):rman备份-数据库指定文件恢复

.数据库指定数据文件恢复 启动数据库的时候报错 ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: D:\ORACLE\PRODUCT\10.2.0\ORADATA\DOCARE\AP MEDCOMM.DBF ORA-27041: unable to open file OSD-04002: 无法打开文件 O/S-Erro…

并发编程-concurrent指南-原子操作类-AtomicBoolean

类AtomicBoolean 可以用原子方式更新的 boolean 值。有关原子变量属性的描述&#xff0c;请参阅 java.util.concurrent.atomic 包规范。AtomicBoolean 可用在应用程序中&#xff08;如以原子方式更新的标志&#xff09;&#xff0c;但不能用于替换 Boolean。 2.构造函数 1.Atom…