android本地数据库,微信数据库WCDB for Android 使用实例
android本地数据库,微信数据库WCDB for Android 使用实例
Home · Tencent/wcdb Wiki
https://github.com/Tencent/wcdb/wiki
WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。
编译依赖项不是必要的,你完全可以使用预先编译好的库。
build.gradle 引入:
dependencies {
implementation 'com.tencent.wcdb:wcdb-android:1.0.2'
}
WCDB for Android
基本功能
基于SQLCipher的数据库加密
使用连接池实现并发读写
内建 Repair Kit 可用于修复损坏数据库
针对占用空间大小优化的数据库备份/恢复功能
日志输出重定向以及性能跟踪接口
内建用于全文搜索的 mmicu FTS3/4 分词器
实例:
import android.content.Context; import com.tencent.wcdb.DatabaseErrorHandler;
import com.tencent.wcdb.database.SQLiteDatabase;
import com.tencent.wcdb.database.SQLiteOpenHelper; import java.io.File; class WcdbHelper extends SQLiteOpenHelper {
private Context mContext; public WcdbHelper(Context context, String name, byte[] password, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, password, factory, version, errorHandler);
this.mContext = context;
} @Override
public void onCreate(SQLiteDatabase db) { } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
LogUtil.i("db","oldVersion:" + oldVersion);
LogUtil.i("db","newVersion:" + newVersion);
} public boolean onDelete(String name) {
File file = mContext.getDatabasePath(name);
return SQLiteDatabase.deleteDatabase(file);
}
}
import android.content.ContentValues;
import android.content.Context; import com.aax.exchange.entity.Favorites;
import com.tencent.wcdb.Cursor;
import com.tencent.wcdb.database.SQLiteDatabase; import java.util.ArrayList;
import java.util.List; public class FavoritesDBManager {
private WcdbHelper mDBHelper;
private SQLiteDatabase mDB;
private String name = "favorites.db";
private String password = "xxx"; public FavoritesDBManager(Context context) {
mDBHelper = new WcdbHelper(context,name,password.getBytes(),null,1,null);
mDB = mDBHelper.getWritableDatabase();
addTable();
} public boolean addFavoritesData(String tradingPair) {
try {
mDB.beginTransaction(); final String sql = "INSERT INTO favorites VALUES(NULL,?)";
Object[] objects = new Object[]{tradingPair};
mDB.execSQL(sql, objects); mDB.setTransactionSuccessful();
}catch (Exception e){
return false;
}finally {
mDB.endTransaction();
}
return true;
} public boolean addFavoritesData(Favorites favorites) {
try {
mDB.beginTransaction(); final String sql = "INSERT INTO favorites VALUES(NULL,?)";
Object[] objects = new Object[]{favorites.getTradingPair()};
mDB.execSQL(sql, objects); mDB.setTransactionSuccessful();
}catch (Exception e){
return false;
}finally {
mDB.endTransaction();
}
return true;
} public boolean addFavoritesList(List<Favorites> list) {
try {
mDB.beginTransaction(); for (Favorites favorites : list) {
Object[] objects = new Object[]{favorites.getTradingPair()};
final String sql = "INSERT INTO favorites VALUES(NULL,?)";
mDB.execSQL(sql, objects);
} mDB.setTransactionSuccessful();
} catch (Exception e) {
return false;
} finally {
mDB.endTransaction();
}
return true;
} public boolean delFavoritesByTradingPair(String tradingPair) {
try {
mDB.beginTransaction();
mDB.delete("favorites","tradingPair=?",new String[]{tradingPair});
mDB.setTransactionSuccessful();
} catch (Exception e) {
return false;
} finally {
mDB.endTransaction();
}
return true;
} public Favorites getFavoritesByTradingPair(String tradingPair){
String sql = "select * from favorites where tradingPair=?";
Cursor cursor = mDB.rawQuery(sql, new String[]{tradingPair});
while (cursor.moveToNext()){
Favorites favorites = new Favorites();
favorites.setTradingPair(cursor.getString(cursor.getColumnIndex("tradingPair")));
return favorites;
}
return null;
} public List<Favorites> getFavoritesListData() {
List<Favorites> listData = new ArrayList<>();
Cursor c = getAllFavoritesInfo();
while (c.moveToNext()) {
Favorites favorites = new Favorites();
favorites.setTradingPair(c.getString(c.getColumnIndex("tradingPair")));
listData.add(favorites);
}
c.close();
return listData;
} private Cursor getAllFavoritesInfo() {
return mDB.rawQuery("SELECT * FROM favorites", null);
} public boolean updateFavoritesByName(String tradingPair){
ContentValues values = new ContentValues();
values.put("tradingPair", tradingPair);
int flag = mDB.update("favorites", values, "tradingPair=?", new String[]{tradingPair});
if (flag > 0) {
return true;
} else {
return false;
}
} public void closeDB() {
mDB.close();
} public Boolean deleteDatabase(String name) {
return mDBHelper.onDelete(name);
} public void deleteFavoritesData() {
mDB.execSQL("DELETE FROM favorites;");
}
public void addTable() {
String SQL_CREATE = "CREATE TABLE IF NOT EXISTS favorites (_id INTEGER PRIMARY KEY AUTOINCREMENT , tradingPair VARCHAR(50) )";
mDB.execSQL(SQL_CREATE);
} }
public class Favorites {
private String tradingPair; public String getTradingPair() {
return tradingPair;
} public void setTradingPair(String tradingPair) {
this.tradingPair = tradingPair;
}
}
public void addFavorites(CoinListInfo data,BaseBindingAdapter mAdapter,Context context){
LogUtil.i("wxh", "getQuote=" + data.getQuote() + " getBase=" + data.getBase()); subscribe(coinSearchActivity,Api.getApiService().addFavorites(data.getQuote() + data.getBase()),
new ObserverResponseListener<Object>() {
@Override
public void onNext(Object o) {
//ToastUtil.showLongToast("add favorites on next");
String tradingPair = data.getQuote() + data.getBase();
FavoritesDBManager fm = new FavoritesDBManager(context);
Favorites fav = new Favorites();
fav.setTradingPair(tradingPair);
//if exits set true or set false
if(data.isFavorite.get()){
data.isFavorite.set(Boolean.FALSE);
fm.delFavoritesByTradingPair(tradingPair);
}else{
data.isFavorite.set(Boolean.TRUE);
fm.addFavoritesData(fav);
} mAdapter.notifyDataSetChanged();
} @Override
public void onError(Throwable e) {
ToastUtil.showLongToast("add favorites error");
}
}, coinSearchActivity.bindToLifecycle()); }
private void setSearch() {
mCompositeDisposable.add(RxTextView.textChanges(mBinding.etSearchKey)
.debounce(300, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.map(CharSequence::toString)
.subscribe(s -> {
//这里可以查询数据库或请求服务器查询
if (!TextUtils.isEmpty(s.trim())){
searchList.clear();
FavoritesDBManager fm = new FavoritesDBManager(CoinSearchActivity.this);
for (CoinListInfo item:
mCoinSearchViewModel.data) {
if (item.getQuote().contains(s.toUpperCase()) || item.getBase().contains(s.toUpperCase())){
String tradingPair = item.getQuote() + item.getBase();
Favorites fav = fm.getFavoritesByTradingPair(tradingPair);
if(null != fav){
item.isFavorite.set(Boolean.TRUE);
}
searchList.add(item);
}
} mAdapter.setFilterData(searchList); }else{
mAdapter.setFilterData(null);
} })); }
android本地数据库,微信数据库WCDB for Android 使用实例的更多相关文章
- 【转】Android动态破解微信本地数据库(EnMicroMsg.db)
最近在公司接了一个任务,需要在几百台手机上安装一个app,目的是获取微信里面的通讯录,并且定时的把他发送到我们的服务器上.当时依次尝试的如下几个方案: 1.通过群控,将好友截图发送到服务端(pytho ...
- Android本地数据存储之SQLite关系型数据库 ——SQLiteDatabase
数据库的创建,获取,执行sql语句: 框架搭建:dao 思考: 1.数据库保存在哪里? 2.如何创建数据库?如何创建表? 3.如何更新数据库?如何更改表的列数据? 4.如何获取数据库? 5.如何修改数 ...
- Android+PHP+MYSQL把数据库中的数据显示在Android界面上
俗话说,好记性不如烂笔头.今天终于体会其中的道理了.昨天写好的代码不知道为何找不到了.所以今天我一定得抽出一点时间把我的代码保存起来,以防我的代码再没有了. 还是先上图片. 这个界面是用ListVie ...
- Android学习笔记--Sqlite数据库
前几天学习了Android中的数据存储,包括文件存储,SharedPreferences存储,还有就是Acndroid中的特色:SQLite数据库存储了.让我比较惊讶的是Android中竟然内嵌了一个 ...
- Android开发学习——SQLite数据库与单元测试
SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHelper public class Myopenhelper extends SQLiteOpenHelp ...
- Android学习---如何创建数据库,SQLite(onCreate,onUpgrade方法)和SQLiteStudio的使用
一.android中使用什么数据库? SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程式庫中.它是D.RichardHipp建立的公有领域项目.SQLite 是一个软件库,实现 ...
- Android 系统API实现数据库的增删改查和SQLite3工具的使用
在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...
- Android如何连接MySQL数据库
Android开发中,大多数连接到远程MySQL数据库的方法是加入特定的Service到代码中.由于MySQL通常是和PHP一起使用的,最简单以及最常见的方法是写PHP脚本管理数据连接,以及从Andr ...
- Android Studio下SQLite数据库的配置与使用(完)
一,AS开发app用,所用的数据库有限制,必须使用较小的SQLite(MySql和Sql Server想想就不显示) 但是该数据库并不需要我们单独下载,安装的SDK中已经有了,在C:\AndroidS ...
随机推荐
- what's the 回撤
什么是“回撤”? “回撤”是个谓语,前面隐含了一个主语.一般来说,没有人说“亏损回撤”的,我们说的“回撤”,通常指“股价回撤”.“市值回撤”.“净值回撤”和“盈利回撤”. “股价回撤”是针对个股的,即 ...
- Python高阶函数map、reduce、filter、sorted的应用
#-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import Web ...
- abap 通过importing 和 exporting 调用其它函数
1:其它函数的(输入或输出)参数名都在=号左边.
- k8s 高级调度 亲和力和反亲和力、绑定标签、污点容忍污点
通过标签绑定 spec: nodeSelector: bigdata-node: bigdata containers: - env: pod只能运行在有bigdata-node: bigdata 标 ...
- JS 8-2 再谈原型
var bosn = new Student创建了Student的实例bosn.bosn的原型(__proto__)指向构造器Student的prototype属性. Student.prototyp ...
- andorid CmakeLists
# cmake要求低版本 cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either ...
- 用int还是用Integer?
昨天例行code review时大家有讨论到int和Integer的比较和使用. 这里做个整理,发表一下个人的看法. [int和Integer的区别] int是java提供的8种原始类型之一,ja ...
- 使用SQL语句如何实现条件判断
客户需求是咨询如何用SQL结合decode函数实现条件判断,比如当某一列数值大于500,对应类型"大于500":当某一列数值小于500,对应类型"小于500". ...
- 实验:记录一则删除GI的过程
环境: RHEL 6.5 + Oracle GI 11.2.0.4 (2 nodes) 参考MOS文档 How to Deconfigure/Reconfigure(Rebuild OCR) or D ...
- BCB Access violateion at Address 0000 0003. Read of address 0000 0003
来自网页:(我的电脑做不到) 运行一个程序,莫名出现一个对话框:access violation at address 0000.. read of address000试了几次问题依旧,网上搜了下解 ...