-
安卓 SQLite数据库操作实例
2016-10-19 09:04:42安卓SQLite数据库JUnit 前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。在Android 运行时环境包含了完整的 SQLite。首先介绍一下SQLite这个数据库:SQLite,是一款轻型的...安卓 SQLite数据库操作实例
安卓SQLite数据库JUnit前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。
在Android 运行时环境包含了完整的 SQLite。
首先介绍一下SQLite这个数据库:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
有一点相对其他数据库来说比较特殊的是:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,意思就是说话你可以在创建数据库表的时候任意定义数据类型,却不影响实际使用时的数据存储。
举个例子说就是你可以在创建表时定义username字段为varchar类型,但是实时使用时你可以向这个字段存入1、2.5、2012-6-6.。。这样的整型,单精,以及时间等其他类型,在SQLite里没有这种限制。
但是有一种情况例外:当字段类型为 ”Integer Primary Key” 时,就是定义表主键,这个就只能是integer类型。和普通数据库相同 。
SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
需要注意一点: SQLite不支持存储过程!
我这里就简单介绍,如需要可自行去了解关于SQLite的更多知识,
然后是我的Demo(一个简单的完成数据库增删查改操作):
首先是项目目录结构:
在本项目中我们使用JUnit测试,就要在AndroidManifest.xml配置JUnit
AndroidManifest.xml
Java代码 收藏代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yzsoft.sqlitedemo.test" android:versionCode="1" android:versionName="1.0" > <!-- 为了方便测试,我直接把上面包位置改成我项目的测试包下 --> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- 因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置( android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )这句这里打上完整的 包名.类名 ,虽然可以直接用 .类名,但是这个.类名是建立在 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yzsoft.sqlitedemo.test" 之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。 --> <activity android:name="org.yzsoft.sqlitedemo.activity.MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- JUnit要加这句 --> <uses-library android:name="android.test.runner" /> </application> <!-- JUnit还要加这段 (android:targetPackage测试类所在包名 ) --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:label="Test Unit Tests" android:targetPackage="org.yzsoft.sqlitedemo.test" > </instrumentation> </manifest>
1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)
Java代码 收藏代码
package org.yzsoft.sqlitedemo.activity; import org.yzsoft.sqlitedemo.util.R; import org.yzsoft.sqlitedemo.util.R.layout; import org.yzsoft.sqlitedemo.util.R.menu; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
2、DBOpenHandler.java
Java代码 收藏代码
package org.yzsoft.sqlitedemo.util; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBOpenHandler extends SQLiteOpenHelper { /** * * @param context * 上下文 * @param name * 数据库名 * @param factory * 可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。 * @param version * 数据库版本号 */ public DBOpenHandler(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) {// 覆写onCreate方法,当数据库创建时就用SQL命令创建一个表 // 创建一个t_users表,id主键,自动增长,字符类型的username和pass; db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)
Java代码 收藏代码
package org.yzsoft.sqlitedemo.vo; public class TUsers { private int id ; private String username; private String pass; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
4、SQLiteDAOImpl.java(数据库操作实现类)
Java代码 收藏代码
package org.yzsoft.sqlitedemo.util; import java.util.ArrayList; import java.util.List; import org.yzsoft.sqlitedemo.vo.TUsers; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class SQLiteDAOImpl { private DBOpenHandler dbOpenHandler; public SQLiteDAOImpl(Context context) { this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1); } public void save(TUsers tusers) {// 插入记录 SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得数据库操作 db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() }); db.close();// 记得关闭数据库操作 } public void delete(Integer id) {// 删除纪录 SQLiteDatabase db = dbOpenHandler.getWritableDatabase(); db.execSQL("delete from t_users where id=?", new Object[] { id.toString() }); db.close(); } public void update(TUsers tusers) {// 修改纪录 SQLiteDatabase db = dbOpenHandler.getWritableDatabase(); db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() }); db.close(); } public TUsers find(Integer id) {// 根据ID查找纪录 TUsers tusers = null; SQLiteDatabase db = dbOpenHandler.getReadableDatabase(); // 用游标Cursor接收从数据库检索到的数据 Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() }); if (cursor.moveToFirst()) {// 依次取出数据 tusers = new TUsers(); tusers.setId(cursor.getInt(cursor.getColumnIndex("id"))); tusers.setUsername(cursor.getString(cursor.getColumnIndex("username"))); tusers.setPass(cursor.getString(cursor.getColumnIndex("pass"))); } db.close(); return tusers; } public List<TUsers> findAll() {// 查询所有记录 List<TUsers> lists = new ArrayList<TUsers>(); TUsers tusers = null; SQLiteDatabase db = dbOpenHandler.getReadableDatabase(); // Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new // String[]{offset.toString(),maxLength.toString()}); // //这里支持类型MYSQL的limit分页操作 Cursor cursor = db.rawQuery("select * from t_users ", null); while (cursor.moveToNext()) { tusers = new TUsers(); tusers.setId(cursor.getInt(cursor.getColumnIndex("id"))); tusers.setUsername(cursor.getString(cursor.getColumnIndex("username"))); tusers.setPass(cursor.getString(cursor.getColumnIndex("pass"))); lists.add(tusers); } db.close(); return lists; } public long getCount() {//统计所有记录数 SQLiteDatabase db = dbOpenHandler.getReadableDatabase(); Cursor cursor = db.rawQuery("select count(*) from t_users ", null); cursor.moveToFirst(); db.close(); return cursor.getLong(0); } }
5、TUsersTest.java(JUnit测试类)
Java代码 收藏代码
package org.yzsoft.sqlitedemo.test; import java.util.List; import org.yzsoft.sqlitedemo.util.DBOpenHandler; import org.yzsoft.sqlitedemo.util.SQLiteDAOImpl; import org.yzsoft.sqlitedemo.vo.TUsers; import android.test.AndroidTestCase; import android.util.Log; public class TUsersTest extends AndroidTestCase { private static final String TAG = "这个是测试类";// 准备好TAG标识用于LOG输出,方便我们用LogCat进行调试 public void testCreate() { DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 创建数据库文件 dbHandler.getWritableDatabase(); } public void testSave() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); TUsers tuser = new TUsers(); tuser.setUsername("用户"); tuser.setPass("密码"); p.save(tuser); Log.i(TAG, "插入成功");// 用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试 } public void testUpate() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); TUsers tuser = p.find(1); tuser.setUsername("张三"); p.update(tuser); Log.i(TAG, "修改成功"); } public void testDelete() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); p.delete(2); Log.i(TAG, "删除成功"); } public void testFind() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); TUsers tuser = p.find(1); Log.i(TAG, tuser.getUsername() + " 用户名"); } public void testGetCount() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); Log.i(TAG, p.getCount() + " 总记录数"); } public void testFindAll() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); List<TUsers> tusers = p.findAll(); for (TUsers tuser : tusers) { Log.i(TAG, tuser.getUsername() + " 用户名"); } } }
-
安卓开发笔记01:SQLite数据库总结
2020-06-13 02:26:36最近刚入门安卓数据库开发,记录一下行之有效的安卓SQLite数据库操作方法。 数据库的创建、查询: 创建空SQLiteDatabase对象:在Mainactivity类的最上面, SQLiteDatabase db = null; 在MainActivity类的...最近刚入门安卓数据库开发,记录一下行之有效的安卓SQLite数据库操作方法。
数据库的创建、查询:
- 创建空SQLiteDatabase对象:在Mainactivity类的最上面,
SQLiteDatabase db = null;
- 在MainActivity类的onCreate方法里面,为db赋实际值:(onCreate中)
db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+"/TEST.DB", null);
TEST.DB是数据库的名字;
3. 接下来,若要在onCreate的时候就查询数据库,则有两种情况,一是数据库未创建,则需要创建一个;而是数据库已经创建,则直接查询即可,如下:(onCreate中)try{ Cursor cursor = db.rawQuery("SELECT * FROM TASK", null); while (cursor.moveToNext()){ listdata.add(cursor.getString(cursor.getColumnIndex("TASK"))); } }catch (Exception e){ String sql_create = "CREATE TABLE TASK(ID INTEGER PRIMARY KEY AUTOINCREMENT, TASK CHAR(255), DESP CHAR(255))"; db.execSQL(sql_create); Cursor cursor = db.rawQuery("SELECT * FROM TASK", null); while (cursor.moveToNext()){ System.out.println(cursor.getString(cursor.getColumnIndex("TASK"))); listdata.add(cursor.getString(cursor.getColumnIndex("TASK"))); } }
如上代码,原理是使用cursor,接受db.rawQuery的返回值,rawQuery是查询语句。将查询到的结果打印出来,用的是while循环加上cursor.moveToNext()。而例如,将TASK列的值取出,所用的代码是
cursor.getString(cursor.getColumnIndex("TASK"))
此处,如果要把数据用列表显示出来,则
listdata.add(cursor.getString(cursor.getColumnIndex("TASK")));
就可以了。
我会专门写一个博客记录ListView的使用方法。
4. 对了,还要在MainActivity类中重写一个getFilesDir的方法:
添加以下代码:@Override public File getFilesDir() { return super.getFilesDir(); }
- 别忘了最前面引入库!
import android.database.sqlite.SQLiteOpenHelper; import android.content.Context; import android.database.sqlite.SQLiteDatabase;
数据库INSERT(增)的方法:
在MainActivity中添加:
private void insertData(SQLiteDatabase db, String task, String desp){ db.execSQL("INSERT INTO TASK (TASK, DESP) VALUES (?, ?)", new String[]{task, desp}); System.out.println("insert a row!"); }
这个函数。当然INSERT的SQL语句是自己的情况而定,在这里默认大家已经学会SQL语句的使用了。添加完这个函数,就可以在例如按钮监听器的回调函数中调用来添加数据库记录了!
第一个参数为db对象,后面为字段名,自己摸索~
当然,传入db对象的前提是,db已经在onCreate方法中赋予了实际值~数据库DELETE(删)的方法:
添加如下方法到MainActivity中:
private void deleteData(SQLiteDatabase db, String task){ db.execSQL("DELETE FROM TASK WHERE TASK=?", new String[]{task}); System.out.println("delete a row!"); }
在回调函数中,就可以调用了,同样,第一个参数为db对象,后面的参数为字段名
数据库UPDATE(改)的方法:
同理,添加下面代码到MainActivity中,就可以了~调用时同样,db为数据库对象。
private void updateData(SQLiteDatabase db, String task){ db.execSQL("UPDATE TASK SET COM=1 WHERE TASK=?", new String[]{task}); System.out.println("update a row!"); }
总结
总结一下,数据库查询用的是cursor,遍历查询结果可以使用while+cursor.moveToNext(),cursor接收db.rawQuery的查询语句返回值;
删改查直接用db.execSQL(SQL语句)。不需要接受返回值,原因可能是exec可以省去commit吧~希望可以帮到大家~如果有错误和疑问欢迎指正和提出~
工作邮箱:yixiaolan@foxmail.com -
【日常】 安卓SQLite数据库的简单操作总结(增删改查)
2019-03-08 14:05:40在安卓中,系统提供了SQLite数据库供我们使用,增删改查四个基本功能是基本的,今天我就我学习中遇到的数据库的增加数据功能来做一个简单回复 创建一个数据库的类 SQLiteOpenHelper是一个系统提供的抽象类,我们通过...在安卓中,系统提供了SQLite数据库供我们使用,增删改查四个基本功能是基本的,今天我就我学习中遇到的数据库的增加数据功能来做一个简单回复
创建一个数据库的类
SQLiteOpenHelper是一个系统提供的抽象类,我们通过写一个类继承这个抽象类, 以此获取一个数据库对象之后进行数据库操作
public class DBOpenHelper extends SQLiteOpenHelper { private Context mContext; public DBOpenHelper( Context context,String name,SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } //创建用户数据表 private static final String USERDB_CREATE = "create table USERINFO ( USER_NAME varchar(15),USER_KEY varchar(20));"; //创建图书数据表 private static final String BOOKDB_CREATE = //将SQL语句封装成一个String文本 "create table BOOKINFO ( " + "BOOK_ID integer primary key," + "BOOK_NAME varchar(20)," + "BOOK_WRITER varchar(20)," + "BOOK_PUBLISHER varchar(20)," + "BOOK_TOTALNUMBER integer," + "BOOK_LEAVENUMBER integer)"; @Override public void onCreate(SQLiteDatabase db) { db.execSQL(USERDB_CREATE); //数据库第一次创建时会执行这里面的语句 db.execSQL(BOOKDB_CREATE); Toast.makeText(mContext,"数据表创建成功",Toast.LENGTH_LONG).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //数据库发生更新时会执行这里 } }
当我们new一个DBOpenHelper时,系统会做出判断,如果该名称的数据库已经存在了,那么就会打开这个数据库,若该名称的数据库不存在,则会执行onCreate中的方法,创建一个数据库
日常使用中,我们需要new一个DBOpenHelper对象来对数据库进行操作
DBOpenHelper dbHelper = new DBOpenHelper(Context context,“DB_NAME.db”,null,1);
第一个参数:上下文对象
第二个参数:数据库名称(一定要以.db结尾)
第三个参数:公司名,一般使用null
第四个参数:版本号version在实例化之后,我们就可以拿到一个SQLiteDataBase对象来对数据库做进一步操作了
SQLiteDataBase db = dbHelper.getReadableDatabase(); //获得一个可读数据库 SQLiteDataBase db = dbHelper.getWriterableDatabase(); //获得一个可写入数据库
注意:可写入的一般情况下都可以读取,而可读取的数据库不一定可以写入, 因此一般我们使用getWriterableDatabase这个方法来获得一个可写数据库
数据库的具体操作
在获取了上面的db对象之后,我们就可以进行对数据库的增删改查了
增加数据
使用ContentValues对象进行封装 ContentValues对象中使用put方法封装键值对数据 然后使用数据库对象的insert方法进行写入
ContentValues values = new ContentValues(); values.put("key",values); //这里的key使用要写入的数据表中的列名以及对应列的数据值 values.put("key2",values); db.insert("USERINFO",null,values); //第一个值:数据表的名称 //第二个值:空白的列中填充的数据,一般为null //第三个值:contentValues对象 //contentValues对象可以反复使用,只要调用clear方法即可清空,然后重新添加键值对数据 values.clear(); //清空contentva对象中的数据
删除数据
同样的,使用上述的数据库对象db,可以再delete方法中指定删除条件
db.delete("BOOKINFO","BOOK_ID = ?",new String[]{String.valueOf(bookArrayList.get(position).ID)});
第一个参数:目标数据表名称
第二个参数:删除条件,其中?为占位符
低三个参数:占位符的具体内容,在这个例子中就是要删除BOOK_ID为指定ID的条目修改数据
在这里,使用update方法对数据进行更新,需要指定几个参数 需要再次使用ContentValues对象来存放修改后的数据的键值对数据,下面为一个例子
ContentValues values = new ContentValues(); values.put("BOOK_NAME",addname.getText().toString()); values.put("BOOK_WRITER",addwriter.getText().toString()); values.put("BOOK_PUBLISHER",addpublisher.getText().toString()); values.put("BOOK_TOTALNUMBER",addnumber.getText().toString()); values.put("BOOK_LEAVENUMBER",addnumber.getText().toString()); db.update("BOOKINFO",values,"BOOK_ID = ?",new String[] {addid.getText().toString()});
在这里我们将修改后的内容存放在values中,在调用update方法对指定数据表的指定对象进行数据的更新
查询数据
查询数据是数据库操作中最简单的,只需要使用query方法以及指定条件即可返回一个cursor对象 cursor对象可以理解为SQL中的游标,在具体的操作之前,我们通常还需要对cursor进行判断是否为空 如果不判断,当数据库无法读得数据时,cusor对象就会为空,这是如果再做具体操作,就会出现空指针报错
Cursor cursor = db.query("BOOKINFO",null,null,null,null,null,null);
可以看到,调用query方法查询时会有整整七个参数
第一个参数:指定数据表的表名
第二个参数:查询字段名,null表示所有字段
第三个参数:查询条件,同样采用占位符 ?
第四个参数:占位符具体指,参数数组
第五个参数:查询结果按照指定字段分组,这里指定字段名
第六个参数:限定分组条件
第七个参数:查询结果排序条件如需查询所有的数据,只需要2-7六个参数统一为null即可
返回cursor对象后判断cursor是否为空
if(cursor.getCount()!=0){ //判断当前返回的cursor是否为空 cursor.moveToFirst(); do{ int id = cursor.getInt(cursor.getColumnIndex("BOOK_ID")); String name = cursor.getString(cursor.getColumnIndex("BOOK_NAME")); String writer = cursor.getString(cursor.getColumnIndex("BOOK_WRITER")); String publisher = cursor.getString(cursor.getColumnIndex("BOOK_PUBLISHER")); int totalnumber = cursor.getInt(cursor.getColumnIndex("BOOK_TOTALNUMBER")); int leavenumber = cursor.getInt(cursor.getColumnIndex("BOOK_LEAVENUMBER")); Book book = new Book(id,name,writer,publisher,totalnumber,leavenumber); bookArrayList.add(book); }while (cursor.moveToNext()); }else{ Toast.makeText(this,"当前数据库中没有图书,请添加",Toast.LENGTH_LONG).show(); }
在if中先让cursor的游标移到第一位,然后开始遍历cursor读取数据,在实例化成一个个对象存放在ArrayList中供其它地方调用
其它
一般我们可以把增删改查也封装成一个类,当需要进行对数据库的操作时,直接传参调用即可
以上仅为我个人学习数据库操作一周的总结,请大神不吝赐教
-
安卓 SQLite数据库操作实例
2012-11-21 08:31:25前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。 在Android 运行时环境包含了完整的 SQLite。 首先介绍一下SQLite这个数据库: SQLite,是一款轻型的数据库,是...前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。
在Android 运行时环境包含了完整的 SQLite。
首先介绍一下SQLite这个数据库:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
有一点相对其他数据库来说比较特殊的是:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,意思就是说话你可以在创建数据库表的时候任意定义数据类型,却不影响实际使用时的数据存储。
举个例子说就是你可以在创建表时定义username字段为varchar类型,但是实时使用时你可以向这个字段存入1、2.5、2012-6-6.。。这样的整型,单精,以及时间等其他类型,在SQLite里没有这种限制。
但是有一种情况例外:当字段类型为 ”Integer Primary Key” 时,就是定义表主键,这个就只能是integer类型。和普通数据库相同 。
SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
需要注意一点: SQLite不支持存储过程!
我这里就简单介绍,如需要可自行去了解关于SQLite的更多知识,
然后是我的Demo(一个简单的完成数据库增删查改操作):
首先是项目目录结构:
在本项目中我们使用JUnit测试,就要在AndroidManifest.xml配置JUnit
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yzsoft.sqlitedemo.test" android:versionCode="1" android:versionName="1.0" > <!-- 为了方便测试,我直接把上面包位置改成我项目的测试包下 --> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- 因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置( android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )这句这里打上完整的 包名.类名 ,虽然可以直接用 .类名,但是这个.类名是建立在 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yzsoft.sqlitedemo.test" 之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。 --> <activity android:name="org.yzsoft.sqlitedemo.activity.MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- JUnit要加这句 --> <uses-library android:name="android.test.runner" /> </application> <!-- JUnit还要加这段 (android:targetPackage测试类所在包名 ) --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:label="Test Unit Tests" android:targetPackage="org.yzsoft.sqlitedemo.test" > </instrumentation> </manifest>
1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)
package org.yzsoft.sqlitedemo.activity; import org.yzsoft.sqlitedemo.util.R; import org.yzsoft.sqlitedemo.util.R.layout; import org.yzsoft.sqlitedemo.util.R.menu; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
2、DBOpenHandler.java
package org.yzsoft.sqlitedemo.util; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBOpenHandler extends SQLiteOpenHelper { /** * * @param context * 上下文 * @param name * 数据库名 * @param factory * 可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。 * @param version * 数据库版本号 */ public DBOpenHandler(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) {// 覆写onCreate方法,当数据库创建时就用SQL命令创建一个表 // 创建一个t_users表,id主键,自动增长,字符类型的username和pass; db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)
package org.yzsoft.sqlitedemo.vo; public class TUsers { private int id ; private String username; private String pass; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
4、SQLiteDAOImpl.java(数据库操作实现类)
package org.yzsoft.sqlitedemo.util; import java.util.ArrayList; import java.util.List; import org.yzsoft.sqlitedemo.vo.TUsers; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class SQLiteDAOImpl { private DBOpenHandler dbOpenHandler; public SQLiteDAOImpl(Context context) { this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1); } public void save(TUsers tusers) {// 插入记录 SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得数据库操作 db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() }); db.close();// 记得关闭数据库操作 } public void delete(Integer id) {// 删除纪录 SQLiteDatabase db = dbOpenHandler.getWritableDatabase(); db.execSQL("delete from t_users where id=?", new Object[] { id.toString() }); db.close(); } public void update(TUsers tusers) {// 修改纪录 SQLiteDatabase db = dbOpenHandler.getWritableDatabase(); db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() }); db.close(); } public TUsers find(Integer id) {// 根据ID查找纪录 TUsers tusers = null; SQLiteDatabase db = dbOpenHandler.getReadableDatabase(); // 用游标Cursor接收从数据库检索到的数据 Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() }); if (cursor.moveToFirst()) {// 依次取出数据 tusers = new TUsers(); tusers.setId(cursor.getInt(cursor.getColumnIndex("id"))); tusers.setUsername(cursor.getString(cursor.getColumnIndex("username"))); tusers.setPass(cursor.getString(cursor.getColumnIndex("pass"))); } db.close(); return tusers; } public List<TUsers> findAll() {// 查询所有记录 List<TUsers> lists = new ArrayList<TUsers>(); TUsers tusers = null; SQLiteDatabase db = dbOpenHandler.getReadableDatabase(); // Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new // String[]{offset.toString(),maxLength.toString()}); // //这里支持类型MYSQL的limit分页操作 Cursor cursor = db.rawQuery("select * from t_users ", null); while (cursor.moveToNext()) { tusers = new TUsers(); tusers.setId(cursor.getInt(cursor.getColumnIndex("id"))); tusers.setUsername(cursor.getString(cursor.getColumnIndex("username"))); tusers.setPass(cursor.getString(cursor.getColumnIndex("pass"))); lists.add(tusers); } db.close(); return lists; } public long getCount() {//统计所有记录数 SQLiteDatabase db = dbOpenHandler.getReadableDatabase(); Cursor cursor = db.rawQuery("select count(*) from t_users ", null); cursor.moveToFirst(); db.close(); return cursor.getLong(0); } }
5、TUsersTest.java(JUnit测试类)
package org.yzsoft.sqlitedemo.test; import java.util.List; import org.yzsoft.sqlitedemo.util.DBOpenHandler; import org.yzsoft.sqlitedemo.util.SQLiteDAOImpl; import org.yzsoft.sqlitedemo.vo.TUsers; import android.test.AndroidTestCase; import android.util.Log; public class TUsersTest extends AndroidTestCase { private static final String TAG = "这个是测试类";// 准备好TAG标识用于LOG输出,方便我们用LogCat进行调试 public void testCreate() { DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 创建数据库文件 dbHandler.getWritableDatabase(); } public void testSave() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); TUsers tuser = new TUsers(); tuser.setUsername("用户"); tuser.setPass("密码"); p.save(tuser); Log.i(TAG, "插入成功");// 用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试 } public void testUpate() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); TUsers tuser = p.find(1); tuser.setUsername("张三"); p.update(tuser); Log.i(TAG, "修改成功"); } public void testDelete() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); p.delete(2); Log.i(TAG, "删除成功"); } public void testFind() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); TUsers tuser = p.find(1); Log.i(TAG, tuser.getUsername() + " 用户名"); } public void testGetCount() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); Log.i(TAG, p.getCount() + " 总记录数"); } public void testFindAll() throws Throwable { SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext()); List<TUsers> tusers = p.findAll(); for (TUsers tuser : tusers) { Log.i(TAG, tuser.getUsername() + " 用户名"); } } }
然后是测试中的一些截图:
最后我们把File Exploer中data/data/项目包名/databases/dbtest.db 导出来,用Navicat Premium等数据库管理工具查看里面的数据:
导出来看看:
虽然安卓平台中SQLite是个小型的本地数据库,但是有些地方使用起来会比文件存储更方便,本文只是对它作一个简单的操作实例 ,有这方面兴趣的童鞋可以自己去深入研究。也希望大家能多交流交流~~~~
最最后~附上项目源码:
-
android mysql sqlite_安卓 SQLite数据库操作实例
2021-01-26 14:33:54前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。在Android 运行时环境包含了完整的 SQLite。首先介绍一下SQLite这个数据库:SQLite,是一款轻型的数据库,是遵守ACID的... -
SQLite数据库总结一
2015-10-21 11:26:33安卓的数据存储有几种方式,其中SQLite数据库存储是最重要的,今天上午特地花了时间去学习,略有心得,来自我总结下,大神指正。 首先当然还是介绍两个类(= = 好像我都喜欢这样开头) SQLiteOpenHelper:可以说是... -
安卓SQLite学习总结
2014-04-09 08:21:23创建和管理数据库版本是用SQLiteOpenHelper()的具体用法 -
安卓开发中到底怎么使用外部已经准备好的sqlite数据库?
2020-05-16 19:44:12首先我们要知道,安卓是无法直接操作项目某个文件夹下的SQLite数据库的,因此我们首先得把数据库移到移动设备上/data/data/你的包名/databases文件夹下,安卓自己创建的数据库也是放在这个地方。 第一步,检查你项目... -
安卓开发能用mysql吗_在安卓开发中使用SQLite数据库操作实例
2021-01-28 17:55:25前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。在Android 运行时环境包含了完整的 SQLite。首先介绍一下SQLite这个数据库:SQLite,是一款轻型的数据库,是遵守ACID的... -
Android基础 =======SQLite数据库的总结
2018-07-26 17:37:38由于电脑卡,运行安卓虚拟机卡,所以一直没有系统学习这方面内容,每次都是看一遍书就过了,现在还是一样的电脑,用的真机测试,发现真机也可以导出数据库表,所以就做了一些demo来系统的学习一下SQLite数据库的使用... -
在安卓开发中使用SQLite数据库操作实例
2014-08-05 15:13:00前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。 在Android 运行时环境包含了完整的 SQLite。 首先介绍一下SQLite这个数据库: SQLite,是一款轻型的数据库,是遵守... -
Android总结三SQLite数据库、ListView下拉刷新
2019-10-03 17:08:18一、SQLite数据库 1.SQLite数据库的特点 安卓手机自带, 小巧, 适合在手机中使用 不区分数据类型(主键除外) SQL语句和MySQL几乎相同 SQLite不使用JDBC连接, 使用的是Android自有的API 每个数据库... -
安卓数据库编程总结(1)
2016-04-11 21:26:22最近学习了安卓数据库编程,一直没时间好好总结一下,因此今天抽空总结一下,算是给自己的知识升华一下。首先,安卓数据存储分为五大类: **1. Shared Preferences - 外部存储(SD卡) - 内部存储(手机内存... -
SQLite复习总结
2019-08-28 00:15:06SQLite是安卓内置的一款轻量级数据库,不仅支持标准的SQL语法,还遵循了数据库的ACID事务,它比一般的数据库更简单,不需要设置账号密码就能使用。SQLiteOpenHelper类可以非常简单的对数据库进行创建和升级。... -
从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库
2020-03-04 15:17:31从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库一、题目来源二、解题过程三、总结四、附件 一、题目来源 题目来源:XCTF app3题目 二、解题过程 1、下载好题目,下载完后发现是.... -
android 之sqlite应用总结
2016-06-24 16:10:47数据库对安卓系统非常重要,网上有很多论坛,但是代码比较凌乱,所以就整理下自己的,希望能对有需要的童鞋有帮助 一、SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入... -
安卓数据库操作
2014-04-24 09:49:58我是我关于android数据库操作的总结笔记,现在共享给大家:) android.database.sqlite.SQLiteOpenHelperpublic SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,... -
安卓操作SQLite基本用法
2017-04-14 10:36:46本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的。 一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经... -
SQLite总结
2016-08-19 23:24:09打开安卓SDK目录下的platform-tools目录,将它的路径配置到系统变量里面去如图: 然后就可以在doc窗口下进行操作了,步骤如下: (1)在doc窗口输入 cd data/data/程序的包名/databases/ (2)接着输入 ls 即可... -
安卓开发学习之Room数据库的使用
2018-04-02 18:20:39数据库存储是安卓开发中数据存储的方式之一,并且安卓为我们提供了sqlite数据库和SQLiteOpenHelper等等强大的开发支持。而Room,则是对它们的一层封装,为的是让我们更加方便地操作sqlite数据库。 以下,为使用... -
最好的安卓数据库ORM框架greenDao使用详解(一)
2015-12-16 23:50:45greendao简介 大家好,我是jayronlou,工作三年,在安卓的学习路上有一些小收获和一些总结,陆陆续续和大家一起分享,希望大家不吝赐教,今天就和大家一起讨论研究greenDao这个安卓的号称最好的ORM框架。 首先来... -
安卓学习日志 Day15 — 数据库基础
2021-02-02 23:53:44文章目录概述数据持久性不同的存储类型选择现实生活中的数据库SQLite 数据库安装 SQLite第一次打开 SQLiteSQLite 中的类型设计和创建数据库快速提示CRUDCURD 概述插入 INSERT表格的局限选择、位置和排序更新 UPDATE... -
android数据库相关知识总结
2014-05-28 19:44:00除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。... -
安卓学习日志 Day16 — 在应用中使用SQLite
2021-02-03 17:46:48Contract 类使用 SQLiteOpenHelper 创建数据库继承 SQLiteOpenHelper创建并连接数据库将信息添加到数据库通过菜单项插入虚假宠物通过编辑器插入宠物数据库查询方法Cursor 对象查询并显示宠物信息总结参考 ... -
安卓第一学期学期总结
2019-01-04 09:01:26这是学习安卓开发的第一个...安卓学习中遇到很多问题,当然也有很多收获,从最底层开始学习,学习存sql语句来对SQLite数据库进行操作,到后面使用谷歌工程师给我们提供的api进行操作,原来需要耗时耗力的事情一瞬间... -
面试遇到问题总结二
2019-03-29 10:15:551、安卓sqlite3数据库跨版本升级操作 安卓数据库升级 sqlite数据库升级 直接安装最新版本的APP,走onCreate方法,所以在数据库版本修改升级的时候,修改onCreate方法创建最新的数据库表格; APP升级操作,... -
SQLite简单语法
2016-10-13 14:42:32用数据库也一段时间了,一直用的是安卓提供的帮助类,突然想学一下用语句操作,现在总结如下 SQLite 语法大小写敏感性 有个重要的点值得注意,SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB ...