`

【android学习之十】——数据存储2:SQLite数据库操作

 
阅读更多

声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误还请大家多多批评。

一、 数据存储之SQLite数据库操作

之前已经学习了三种数据操作的方式,还有一种最为常用数据库操作,因为之前的三种数据方式一般只存储一些简单的,数据量较小的数据。如果数据量比较大,需要管理,维护与升级的话,就不能满足需要了。而SQLite数据库则提供这种问题的解决方案。关于为什么使用SQLite数据,网上也有很多关于SQLite数据的优点,简单说一下:

1、 轻量级,它是进程内的数据库引擎,不存在数据库客户端与服务器端。

2、 独立性,SQLite的核心引擎不依赖第三方软件,也不需要安装。

3、 隔离性,SQLite数据库中所有信息都存放在一个文件中,方便管理与维护。

4、 跨平台,支持大部分操作系统,也支持很多手机操作系统。

5、 多语言接口,支持很多语言编程接口。

6、 安全性,SQLite数据库通过数据库级上的独占性和共享锁来实现独立事物处理。也就是能够满足同事多个线程同个时间从数据库中读取数据,但是只有一个是可写的。

数据库操作,无非就是针对数据的增删改查,以及表的创建于删除,下面例子中包含了以上操作。该实例默认会创建一data1数据库并且创建表table1,然后设定按键的监听,点击方向键左时会添加一条数据,方向键右会删除一条数据,数字键1为修改最后一条数据,数字键2为删除表,数字键3为删除数据库。

关键源码:

public class DatabaseDataActivity extends Activity {
	private static int count = 0;	
	
	private SQLiteDatabase sqLiteDatabase = null;	//数据库对象
	
	private final static String DATABASE_NAME = "data1";//数据库名
	private final static String TABLE_NAME	= "table1";	//表名
	private final static String TABLE_ID = "_id";		
	private final static String TABLE_NUM = "num";
	private final static String TABLE_DATA = "data";
	private final static String CREATE_TABLE = "Create table " + TABLE_NAME + " (" + TABLE_ID + " integer primary key," + TABLE_NUM + " integer," + TABLE_DATA + " Text)";

	LinearLayout linearLayout = null;
	ListView listView = null;	//用来显示数据库中得数据
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.setBackgroundColor(android.graphics.Color.BLACK);
        
        listView = new ListView(this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        listView.setBackgroundColor(Color.BLACK);
        linearLayout.addView(listView, params);
        
        setContentView(linearLayout);	//设置显示linearLayout布局
        
        sqLiteDatabase = this.openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);	//打开或者创建数据库
        
        try {
			sqLiteDatabase.execSQL(CREATE_TABLE);
		} catch (Exception e) {
			UpdataAdapter();
		}
    }

    //更新并显示视图
	private void UpdataAdapter() {
		// 获取数据库Phones的Cursor
		Cursor cur = sqLiteDatabase.query(TABLE_NAME, new String[] { TABLE_ID, TABLE_NUM, TABLE_DATA }, null, null, null, null, null);

		count = cur.getCount();
		if (cur != null && cur.getCount() >= 0){
			// ListAdapter是ListView和后台数据的桥梁
			ListAdapter adapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_list_item_2,// 定义List中每一行的显示模板,表示每一行包含两个数据项
				cur,								// 数据库的Cursor对象
				new String[] { TABLE_NUM, TABLE_DATA },// 从数据库的TABLE_NUM和TABLE_DATA两列中取数据
				new int[] { android.R.id.text1, android.R.id.text2 });// 与NAME和NUMBER对应的Views
			listView.setAdapter(adapter);/* 将adapter添加到m_ListView中 */
		}
	}


	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		if (keyCode == KeyEvent.KEYCODE_BACK){
			sqLiteDatabase.close();
			this.finish();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	public boolean onKeyUp(int keyCode, KeyEvent event) {
		switch (keyCode){
			case KeyEvent.KEYCODE_DPAD_LEFT:
				AddData();
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				DeleteData();
				break;
			case KeyEvent.KEYCODE_1:
				UpData();
				break;
			case KeyEvent.KEYCODE_2:
				DeleteTable();
				break;
			case KeyEvent.KEYCODE_3:
				DeleteDataBase();
				break;
		}
		return true;
	}
	//删除数据库
	private void DeleteDataBase() {
		this.deleteDatabase(DATABASE_NAME);
		this.finish();
	}
	//删除表
	private void DeleteTable() {
		sqLiteDatabase.execSQL("DROP TABLE " + TABLE_NAME);
		this.finish();
	}
	//更新数据
	private void UpData() {
		ContentValues values = new ContentValues();
		values.put(TABLE_NUM, count);
		values.put(TABLE_DATA, "修改后的数据"+count);
		
		//更新数据
		sqLiteDatabase.update(TABLE_NAME, values, TABLE_NUM + "=" +Integer.toString(count-1), null);		
		UpdataAdapter();
	}
	//删除数据
	private void DeleteData() {
		// TODO Auto-generated method stub
		sqLiteDatabase.execSQL("delete from " + TABLE_NAME + " where _id = " + Integer.toString(count));
		
		count--;
		if(count < 0){
			count = 0;
		}		
		UpdataAdapter();
	}
	//添加数据
	private void AddData() {
		// TODO Auto-generated method stub
		ContentValues cv = new ContentValues();
		cv.put(TABLE_NUM, count);
		cv.put(TABLE_DATA, "测试数据库数据" + count);
		/* 插入数据 */
		sqLiteDatabase.insert(TABLE_NAME, null, cv);
		count++;
		UpdataAdapter();
	}
}

运行效果:左图为新增操作,右图为修改操作

一般查看数据库可以先把该对应目录下得数据库文件导出后,使用SQLiteSpy.exe工具来查看,数据库文件的存放地址与之前的数据操作的存储目录一致,数据库文件放在databases文件下。该工具可以到我的资源里去下载。


【遇到问题】

开始在创建表的时候,我设置的主键为ID,但是实际在运行示例的时候,总是报_ID找不到,比较纳闷,我没有建立这一列啊。后来发现,针对SQLite的表创建时必须_ID,因为底层类在找得时候,就是以_ID来找,改过来之后就可以运行了。

【扩展学习】游标Cursor的使用

关于 Cursor,在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情:

Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。
你必须知道每一列的名称。
你必须知道每一列的数据类型。
Cursor 是一个随机的数据源。
所有的数据都是通过下标取得。
关于 Cursor 的重要方法:

close() —— 关闭游标,释放资源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) —— 在缓冲区中检索请求的列的文本,将将其存储
getColumnCount() —— 返回所有列的总数
getColumnIndex(String columnName) —— 返回指定列的名称,如果不存在返回-1
getColumnIndexOrThrow(String columnName) —— 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex) —— 从给定的索引返回列名
getColumnNames() —— 返回一个字符串数组的列名
getCount() —— 返回Cursor 中的行数
moveToFirst() —— 移动光标到第一行
moveToLast() —— 移动光标到最后一行
moveToNext() —— 移动光标到下一行
moveToPosition(int position) —— 移动光标到一个绝对的位置
moveToPrevious() —— 移动光标到上一行


下面来看看一小段代码:

if (cur.moveToFirst() == false){
//为空的Cursor
return;
}

访问 Cursor 的下标获得其中的数据

int nameColumnIndex = cur.getColumnIndex(People.NAME);
String name = cur.getString(nameColumnIndex);
现在让我们看看如何循环 Cursor 取出我们需要的数据

while(cur.moveToNext()){
//光标移动成功
//把数据取出
}

当cur.moveToNext() 为假时将跳出循环,即 Cursor 数据循环完毕。

分享到:
评论

相关推荐

    实验十 使用SQLite数据库存储数据

    实验十 使用SQLite数据库存储数据

    Android 绿豆通讯录【SQLite数据库】

     Android 绿豆通讯录( SQLite数据库 + ListView数据展示控件 ) https://blog.csdn.net/weixin_44949135/article/details/106029404 采用 SQLite数据库 + ListView数据展示控件,可将用户添加的所有信息,分条...

    Android项目设计与开发:SQLite 2.ppt

    嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 2 SQLite 数据库管理员 数据库实体A 表 表 数据库实体B 表 表 数据库实体 表 表 SQLite 我们已经掌握: SQLite是一款轻量级的关系型数据库,它的运算效率高...

    Android项目设计与开发:SQLite 1.ppt

    嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 1 SQLite 概念: SQLite是一款轻量级的关系型数据库,它的运算效率高,占用资源少,因此比较适合在移动设备上使用。 SQLite Android为了让我们更加方便地...

    【安卓项目】——新闻资讯类项目

    Android学习笔记(十二)——数据存储(SQLite数据库) Android学习笔记(十三)——数据存储(LitePal操作数据库) Android学习笔记(十四)——内容提供器 Android学习笔记(十五)——侧滑容器(ViewPager) .......

    Android学习笔记(十二)——数据存储(SQLite数据库)

    【第一部分】历史文章: Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) ...Android学习笔记(七)——数据存储(共享参数Share

    Android项目设计与开发:SQLite 3.ppt

    嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 3 SQLite 内容: SQLite如何插入数据。 (1)SQL语句。insert into table…value() (2)使用SQLiteOpenHelper接口 实验 通过SQLiteOpenHelper接口insert ...

    Android项目设计与开发:SQLite 4.ppt

    嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 4 SQLite 内容: SQLite如何删除数据。 (1)SQL语句。delete from table where.. (2)使用SQLiteOpenHelper接口 实验 通过SQLiteOpenHelper接口delete 来...

    AndroidStudio课程设计-通讯录系统(高分毕设,Android期末作业,Android课设,AndroidStudio

    2:使用sqlite本地数据库进行数据的存储; 用户功能介绍: 1:注册模块,用户在使用软件前需要进行用户信息的注册 2:用户登录:用户通过自己的注册信息进行软件的登录, 3:联系人管理:用户可以对联系人信息进行...

    Android数据持久化之SQLite数据库用法分析

    本文实例讲述了Android数据持久化之SQLite数据库用法。分享给大家供大家参考,具体如下: 这一节我将总结一下android中的另一种数据存储——SQLite 的相关知识点 SQLite数据库是android系统自带的,主要用到的类包括...

    Android Studio实现的天气预报系统(高分毕设,Android期末作业,Android课设)

    2:使用sqlite本地数据库进行数据的存储; 3:天气数据来源网页“天气网”爬虫技术获取; 客户端功能介绍: 1:开屏页面:软件启动会显示2秒的开屏页面 2:天气数据:进入软件之后会显示当前选择的天气数据信息 3...

    基于Android的新闻app(爬虫获取新闻数据)

    2:使用sqlite本地数据库进行数据的存储; 3:使用爬虫技术获取新闻的数据,获取的是“每日新闻”的网站数据; 功能介绍: 1:注册模块,用户在使用软件前需要进行用户信息的注册 2:用户登录:用户通过自己的注册...

    基于Android的漫画app

    2:使用sqlite本地数据库进行数据的存储; 3:漫画数据来源于网页爬虫技术获取; 用户功能介绍: 1:注册模块,用户在使用软件前需要进行用户信息的注册 2:用户登录:用户通过自己的注册信息进行软件的登录, 3...

    Android期末大作业校园图书馆图书借阅系统

    2:使用sqlite本地数据库进行数据的存储; 管理员身份功能介绍: 1:用户登录:用户通过账号信息进行软件的登录, 2:图书管理:管理员可以添加图书信息以及查看用户的借阅状态 2:借书公告:管理员可以添加借书公告...

    安卓开发实验6——SQLite和SQLiteDatabase应用

    课堂作业实验6源码。利用android的内置数据库SQLite存储新闻信息,用listview组件以列表形式显示新闻内容,

    在android studio中用SQLiteOpenHelper()方法建立数据库

    在android studio中存储数据有三个方法,分别是: (1)简单存储——SharedPreferences (2)文件存储: 内部存储——应用程序私有文件 外部存储——SD卡 资源文件——只读( RAW 、XML) (3)数据库存储——...

    Android SQLite数据库增删改查操作的使用详解

    一、使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的...

    移动应用程序设计基础——数据库实践——简单日记本.zip

    移动应用程序设计基础——数据库实践——简单日记本 详细内容在已在本报告中说明

    Android开发与应用——张荣,原书配套课件

    6.4 SQLite数据库 6.4.1 SQLite基本操作 6.4.2 SQLiteOpenHelper 6.5 Content Provider 6.5.1 使用Content Provider发布数据 6.5.2 使用Content Resolver获取数据 6.6 小结 练习 第7章 多线程及消息...

    第8章 移动信息仓库—Android的数据存储操作.pdf

    典型的桌面操作系统提供一种公共文件系统——任何应用软件可以...在Android中,可供选择的存储方式有SharedPreferences、文件存储、SQLite数据库方式、内容提供器(content provider)和网络,我们将在本章详细介绍。

Global site tag (gtag.js) - Google Analytics