Android学习--SQLite数据库存储

Sqlite数据库

1 特点

  1. 安装文件小: 最小只有几百K, Android系统已经安装
  2. 支持多操作系统: Android, WP, IOS, Windows,Linux等
  3. 支持多语言: 比如 Java 、 PHP、C#等.
  4. 处理速度快: 处理速度比Mysql, Oracle,SqlServer都要快(数据量不是特别大)
  5. Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)

2 Sqlite数据库客户端

在这里插入图片描述

3 Sqlite数据库命令行

  • adb shell 进入系统根目录

  • cd data/data/…/databases : 进入包含数据库文件的文件夹下

  • sqlite3 contacts2.db : 使用sqlite3命令连接指定的数据库文件, 进入连接模式

  • .help : 查看命令列表

  • .tables : 查看所有表的列表

  • 执行insert/delete/update/select语句

  • .exit : 退出数据库连接模式

  • Ctrl + C : 直接退出sell模式

4 数据类型

Sqlite支持的数据类型与Mysql相似, 常用的数据类型

  • INT/INTEGER : 整数
  • FLOAT/DOUBLE : 小数
  • CHAR/VARCHAR/TEXT : 字符串文本
  • BLOB : 文件
  • DATE/ DATETIME : 日期/日期时间

5 Sqlite建表

Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:

  • 最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动转换, 但除varchar类型外最好指定类型。
  • Sqlite中的主键最名称建议使用_id。
create table employee (
       _id integer primary key autoincrement, /*主键,自增长*/
       name varchar,                /*字符串*/
       salary double,                                /*小数*/
       birthday date                                /*日期, 可直接插入日期格式字符串*/
)

6 Sqlite的CRUD语句

/*插入*/
INSERT INTO employee (name,salary,birthday) VALUES('Tom', 8000, '1988-09-21');
/*删除*/
DELETE FROM employee WHERE _id=2 
/*更新*/
UPDATE employee SET name='Jack',salary=salary+1000 WHERE _id=1
/*查找*/
SELECT * FROM employee where _id=3

7 相关API

7.1 SQLiteOpenHelper: 数据库操作的抽象帮助类

 // 构造方法, 指定数据库文件名和版本号
 SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) 
 // 用于创建表
 abstract void onCreate(SQLiteDatabase db) 
 // 用于版本更新
 abstract void onUpgrade() 
 // 得到数据库连接
 SqliteDatabase getReadableDatabase()

7.2 SqliteDatabase: 代表与数据库的连接的类

 long insert(): 用于执行insert SQL, 返回id值
 int update(): 用于执行update SQL
 int delete(): 用于执行delete SQL
 Cursor query(): 用于执行select SQL, 返回包含查询结果数据的Cursor
 void execSql(sql) : 执行sql语句
     
 beginTransaction(): 开启事务
 setTransactionSuccessful(): 设置事务是成功的
 endTransaction(): 结束事务, 可能提交事务或回滚事务
 openDatabase(String path, CursorFactory factory, int flags):  得到数据库连接

7.3 Cursor : 包含所有查询结果记录的结果集对象(光标,游标)

  int getCount() : 匹配的总记录数
  boolean moveToNext() : 将游标移动到下一条记录的前面
  Xxx getXxx(columnIndex) : 根据字段下标得到对应值
  int getColumnIndex(columnname): 根据字段名得到对应的下标

测试用例

数据库的创建
数据库的版本更新
表数据的CRUD
数据库事务

DBHelper.java

package com.shenju.test010_sp.helper;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
 * DB数据库的帮助类
 * @author SJ-001
 *
 */
public class DBHelper extends SQLiteOpenHelper{

	/**
	 * * 什么时候才会创建DB文件:(1)文件不存在的时候 (2)连接数据库
	 * @param context
	 * @param name
	 * @param factory
	 * @param version
	 */
	public DBHelper(Context context,int version) {
		super(context,"wuk.db", null, version);
		
	}

	/**
	 * 创建文件时候调用一次
	 * 获取连接的时候会调用一次
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		
		Log.e("TAG","进入创建方法。。。。");
		//创建表
		String sql="create table person(_id integer primary key autoincrement,name varchar, age int)";
		db.execSQL(sql);
		//插入一些初始化数据
		db.execSQL("insert into person (name, age) values ('Tom1', 11)");
		db.execSQL("insert into person (name, age) values ('Tom2', 12)");
		db.execSQL("insert into person (name, age) values ('Tom3', 13)");
		
	}

	//当传入的版本号大于数据库的版本号时调用
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
		Log.e("TAG","进入版本更新方法。。。");
	}

}

DBActivity.java

package com.shenju.test010_sp;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.shenju.test010_sp.helper.DBHelper;
import com.shenju.test010_sp.model.Person;

/**
 * 数据库存储
 * 应用:应用运行需要保存一系列有一定结构的数据
 * 保存路径:数据保存的路径: /data/data/projectPackage/databases/xxx.db
 * 默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作
 * 应用卸载时会删除此数据
 * @author SJ-001
 *
 */
public class DBActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_db);
	}

	/**
	 * 创建数据库
	 * @param v
	 */
	public void testCreateDB(View v){
		
		DBHelper dbHelper=new DBHelper(this,1);
		
		//获取连接
		SQLiteDatabase database=dbHelper.getReadableDatabase();
		
		Toast.makeText(this,"数据库创建完成",0).show();
	}
	
	/**
	 * 更新数据库版本
	 * @param v
	 */
	public void testUpdateDB(View v){
		
		DBHelper dbHelper=new DBHelper(this,2);		
		//获取连接
		SQLiteDatabase database=dbHelper.getReadableDatabase();
		Toast.makeText(this, "数据库版本更新完毕",0).show();
	}
	
	/**
	 * 插入操作
	 * @param v
	 */
	public void testInsert(View v){
		
		DBHelper dbHelper=new DBHelper(this,2);
		//获取连接
		SQLiteDatabase database= dbHelper.getReadableDatabase();
		
		ContentValues cv=new ContentValues();
		cv.put("name", "wuk");
		cv.put("age", 24);
		long count=database.insert("person",null,cv);
		database.close();
		Toast.makeText(this, "插入完成,插入"+count+"行",0).show();
		
	}
	
	/**
	 * 数据库数据更新
	 * @param v
	 */
	public void testUpdate(View v){
		
		DBHelper dbHelper=new DBHelper(this, 2);
		SQLiteDatabase sQLiteDatabase = dbHelper.getReadableDatabase();
		ContentValues cv=new ContentValues();
		cv.put("name", "jack");
		cv.put("age", 19);
		sQLiteDatabase.update("person",cv, "_id=?",new String[]{"4"});
		sQLiteDatabase.close();
		Toast.makeText(this, "数据修改成功",0).show();

	}
	
	/**
	 * 删除数据
	 * @param v
	 */
	public void testDelete(View v){
		
		DBHelper dbHelper =new DBHelper(this,2);
		SQLiteDatabase database= dbHelper.getReadableDatabase();
		long count=database.delete("person","_id=?", new String[]{"2"});
		database.close();
		Toast.makeText(this, "数据删除条数为"+count+"条",0).show();
	}
	
	/*
	查询
	*/
	public void testQuery(View v){
		
		DBHelper dbHelper =new DBHelper(this, 2);
		SQLiteDatabase database= dbHelper.getReadableDatabase();
		Cursor cursor = database.query("person", null, "_id=?", new String[]{"3"}, null, null, null);
		int  count=cursor.getCount();
		Log.e("TAG", "查询到的条数为"+count);
		List<Person> lists=new ArrayList<Person>();
		while(cursor.moveToNext()){
			
			Long _id=cursor.getLong(0);
			String name=cursor.getString(0);
			Integer age= cursor.getInt(2);
			Person person=new Person();
			person.set_id(_id);
			person.setName(name);
			person.setAge(age);
			
			lists.add(person);
		}
		
		cursor.close();
		database.close();
		// 4. 提示
		Toast.makeText(this, "查询结果为count=" + count+"条", 1).show();
		
	}
}

/*
	 * 测试事务处理
	 * update person set age=16 where _id=1
	 * update person set age=17 where _id=3
	 * 
	 * 一个功能中对数据库进行的多个操作: 要就是都成功要就都失败
	 * 事务处理的3步:
	 * 1. 开启事务(获取连接后)
	 * 2. 设置事务成功(在全部正常执行完后)
	 * 3. 结束事务(finally中)
	 */
	public void testTransaction(View v) {
		
		SQLiteDatabase database = null;
		try{
			DBHelper dbHelper = new DBHelper(this, 2);
			database = dbHelper.getReadableDatabase();
			
			//1. 开启事务(获取连接后)
			database.beginTransaction();
			
			//执行update  update person set age=16 where _id=1
			ContentValues values = new ContentValues();
			values.put("age", 16);
			int updateCount = database.update("person", values , "_id=?", new String[]{"1"});
			Log.e("TAG", "updateCount="+updateCount);
			
			//出了异常
			boolean flag = true;
			if(flag) {
				throw new RuntimeException("出异常啦!!!");
			}
			
			//执行update  update person set age=17 where _id=3
			values = new ContentValues();
			values.put("age", 17);
			int updateCount2 = database.update("person", values , "_id=?", new String[]{"3"});
			Log.e("TAG", "updateCount2="+updateCount2);
			
			//2. 设置事务成功(在全部正常执行完后)
			database.setTransactionSuccessful();
			
		} catch(Exception e) {
			e.printStackTrace();
			Toast.makeText(this, "出异常啦!!!", 1).show();
		} finally {
			//3. 结束事务(finally中)
			if(database!=null) {
				database.endTransaction();
				database.close();
			}
		}
		
	}

注意:
只要没有执行到设置事务成功就会事务回滚。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android中的SQLite数据库是一种轻量级的数据库,它可以在Android应用程序中存储和检索数据。SQLite数据库使用SQL语言来管理数据,可以在Android应用程序中创建、读取、更新和删除数据。使用SQLite数据库可以使应用程序更加高效和可靠,因为它可以在本地存储数据,而不需要访问网络。在Android中使用SQLite数据库需要使用SQLiteOpenHelper类来创建和管理数据库SQLiteOpenHelper类提供了一些方法来创建和升级数据库,以及插入、查询、更新和删除数据。在使用SQLite数据库时,需要注意数据类型、表结构、SQL语句等方面的问题,以确保数据的正确性和完整性。 ### 回答2: Android平台经常使用SQLite数据库存储和管理本地数据。在本文中,我们将讨论如何在Android中使用SQLite数据库。 首先,在Android中使用SQLite数据库,我们需要创建一个SQLiteOpenHelper类。这个类用于创建和升级数据库。它包含了两个重要的方法:onCreate()和onUpgrade()。onCreate()方法将在首次创建数据库时被调用。onUpgrade()方法将在升级数据库时被调用。我们可以在这个类中定义表名,列名,数据库版本号和其他数据库相关信息。 接下来,在我们使用数据库前,需要实例化一个SQLiteOpenHelper类对象。这个对象用于打开或创建数据库。我们可以使用getReadableDatabase()和getWritableDatabase()方法来获取一个可读/写的数据库对象。 在获取数据库对象后,我们可以执行SQL命令来操作数据库。我们可以使用execSQL()方法来执行SQL命令。我们可以使用insert()、update()和delete()方法来执行增、删、改操作。我们可以使用rawQuery()方法来执行查询操作。 SQLiteOpenHelper类和SQLiteDatabase类并不是线程安全的。因此我们需要确保在使用时进行同步操作。我们可以使用synchronized关键字来达到同步效果。 在Android中,许多第三方的开源框架,如OrmLite、GreenDao和Realm等,提供了ORM(对象关系映射)的功能,使得数据库的操作更加简单和便捷。 总的来说,在Android中使用SQLite数据库可以轻松地存储和管理本地数据。SQLiteOpenHelper和SQLiteDatabase提供了丰富的API来操作数据库。ORM框架为我们提供了更加简便的数据库操作方式。因此,掌握AndroidSQLite数据库的使用非常重要。 ### 回答3: Android SQLite数据库Android开发中最常用的数据库之一,它是一个基于文件的嵌入式关系数据库管理系统SQLite在设计时考虑到了资源占用和运行效率,所以非常适合在移动设备上使用。下面将详细介绍如何使用Android SQLite数据库。 1. 创建数据库 首先需要创建一个SQLite数据库,通过SQLiteOpenHelper类来创建,传入的参数主要是数据库版本号和数据库名称。在SQLiteOpenHelper的子类中重写onCreate方法来创建表格和一些初始化操作。 2. 执行SQL语句 在SQLiteOpenHelper的子类中重写onUpgrade方法来执行升级操作,可以通过执行ALTER TABLE语句来修改表格结构,并通过DROP TABLE语句删除表格。除此之外,在应用中也可以通过SQLiteDataBase对象的execSQL方法来执行SQL语句,如插入、删除或修改数据等。 3. 增删改查操作 增加(insert):通过SQLiteDataBase对象的insert方法来实现,在方法中传入表名和map对象,map对象中存储数据的键值对。 删除(delete):同样通过SQLiteDataBase对象的delete方法来实现,传入表名和删除条件。 修改(update):也是通过SQLiteDataBase对象的update方法来实现,同时传入修改的数据及条件。 查询(query):同样通过SQLiteDataBase对象的query方法来实现,传入要查询的表名、查询的列、查询条件等参数即可。 4. 事务操作 SQlite数据库支持事务操作,可以在一组操作中,只要有一个操作出现问题,就可以将之前的操作全部回滚,以保证数据的完整性和一致性。 以上就是android-sqlite数据库的使用方法,当然还有很多细节需要注意,例如:表格的设计、SQL语句的优化等。熟练掌握SQLite的使用,可以帮助开发者更好地管理应用数据,提高应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术闲聊DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值