在 AndroidStudio 4.1.1 上使用 GreenDao
最编程
2024-06-24 10:49:34
...
一、概述
项目中需要用到数据库的能力,对比以及根据以往的经验,决定使用GreenDao。
二、实际操作步骤
第一步:在项目下的.gradle文件中加入插件:classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin
第二步:在module目录下的.gradle文件夹中进行操作
a.引入greendao
implementation 'org.greenrobot:greendao:3.3.0' // add library
b.在android{}大括号中加入,如下所示:ps:我项目是kotlin和java混编如果设置了targetGenDir 目录则无法生成DaoMaster和DaoSession,所以我把指定的目录注释了
greendao { schemaVersion 1 //数据库版本号 daoPackage 'com.tony.demo.greendao' //填写自己的包名+文件夹test // 设置DaoMaster、DaoSession、Dao 包名 // targetGenDir 'src.main.java'//设置DaoMaster、DaoSession、Dao目录 //主要此时的这行代码如果在生成之后没有出现以下的三个类那么采取注释掉 }
c.引入greendao插件,这里需要注意一点:如果项目中使用了apply plugin: 'kotlin-kapt',则kapt插件的位置必须在greendao的下面,不然编译不通过
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' id 'org.greenrobot.greendao' }
第三步:新建一个实体类,然后build-->rebuild项目。之后make project就可以生成DaoMaster和DaoSession了
@Entity public class Student { @Id private String studentId; @Property private String studentName; @Property private String studentAge;public String getStudentId() { return studentId; } public void setStudentId(String studentId) { this.studentId = studentId; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public String getStudentAge() { return studentAge; } public void setStudentAge(String studentAge) { this.studentAge = studentAge; } }
第四步:进行增删改查的测试
/** * Creator: tony * Date: 2023/8/15 * Description:数据库管理类 */ public class DaoManager { private static final String DB_NAME = "luyinji_aic.db";//数据库名称 private static DaoManager mDaoManager; private DaoMaster.DevOpenHelper mHelper; private DaoMaster mDaoMaster; private DaoSession mDaoSession; private Context context; private DaoManager(Context context) { this.context = context; } /** * 使用单例模式获得操作数据库的对象 * * @return */ public static DaoManager getInstance() { if (mDaoManager == null) { synchronized (DaoManager.class) { if (mDaoManager == null) { mDaoManager = new DaoManager(ContextUtils.INSTANCE.getApplicationContext()); } } } return mDaoManager; } /** * 获取DaoSession * * @return */ public synchronized DaoSession getDaoSession() { if (null == mDaoSession) { mDaoSession = getDaoMaster().newSession(); } return mDaoSession; } /** * 设置debug模式开启或关闭,默认关闭 * * @param flag */ public void setDebug(boolean flag) { QueryBuilder.LOG_SQL = flag; QueryBuilder.LOG_VALUES = flag; } /** * 关闭数据库 */ public synchronized void closeDataBase() { closeHelper(); closeDaoSession(); } /** * 判断数据库是否存在,如果不存在则创建 * * @return */ private DaoMaster getDaoMaster() { if (null == mDaoMaster) { mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null); mDaoMaster = new DaoMaster(mHelper.getWritableDb()); } return mDaoMaster; } private void closeDaoSession() { if (null != mDaoSession) { mDaoSession.clear(); mDaoSession = null; } } private void closeHelper() { if (mHelper != null) { mHelper.close(); mHelper = null; } } }
/** * Creator: tony * Date: 2023/8/15 * Description:数据库帮助类 */ public class BaseBeanManager<T, K> { private AbstractDao<T, K> mDao; public BaseBeanManager(AbstractDao dao) { mDao = dao; } public void save(T item) { mDao.insert(item); } public void save(T... items) { mDao.insertInTx(items); } public void save(List<T> items) { mDao.insertInTx(items); } public void saveOrUpdate(T item) { mDao.insertOrReplace(item); } public void saveOrUpdate(T... items) { mDao.insertOrReplaceInTx(items); } public void saveOrUpdate(List<T> items) { mDao.insertOrReplaceInTx(items); } public void deleteByKey(K key) { mDao.deleteByKey(key); } public void delete(T item) { mDao.delete(item); } public void delete(T... items) { mDao.deleteInTx(items); } public void delete(List<T> items) { mDao.deleteInTx(items); } public void deleteAll() { mDao.deleteAll(); } public void update(T item) { mDao.update(item); } public void update(T... items) { mDao.updateInTx(items); } public void update(List<T> items) { mDao.updateInTx(items); } public T query(K key) { return mDao.load(key); } public List<T> queryAll() { return mDao.loadAll(); } public List<T> query(String where, String... params) { return mDao.queryRaw(where, params); } public QueryBuilder<T> queryBuilder() { return mDao.queryBuilder(); } public long count() { return mDao.count(); } public void refresh(T item) { mDao.refresh(item); } public void detach(T item) { mDao.detach(item); } }
public class StudentManager extends BaseBeanManager<Student, Long> { public StudentManager(AbstractDao dao) { super(dao); } }
/** * green到数据库测试 */ class GreenDaoTestActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_green_dao_test) initView() } private fun initView() { btnSave.setOnClickListener { saveStudent() } btnDelete.setOnClickListener { deleteStudent() } btnUpdate.setOnClickListener { updateStudent() } btnQuery.setOnClickListener { queryStudent() } } private fun saveStudent() { ManagerFactory.getInstance().studentManager.saveOrUpdate(Student("1", "杨洛峋", "5")) } private fun deleteStudent() { ManagerFactory.getInstance().studentManager.delete(Student("1","杨洛峋","5")) } private fun updateStudent() { ManagerFactory.getInstance().studentManager.update(Student("1", "杨洛峋小宝宝", "不到5岁")) } private fun queryStudent() { var list = ManagerFactory.getInstance().studentManager.queryAll() if (list != null && list.isNotEmpty()) { tvDaoContent.text = "${list[0].studentName}" } else { tvDaoContent.text = "数据库中 没有数据了" } } }
三、小结
以上是做的一个简单的测试。增删改查是没什么问题。要想在项目中愉快的使用,还需要进一步的做一下封装
推荐阅读
-
在安卓设备上使用 Kivy 和 OpenCV 来调用摄像头并显示实时画面。
-
在 CentOS 7 上安装和配置 Telnet 服务(使用非根用户登录)
-
在Linux上使用阿里云盘
-
在Linux服务器上使用mysql-front进行远程连接至自己的mysql服务器
-
在Linux上使用webdav进行挂载
-
在 CentOS 7 上如何安装并使用 exFAT 磁盘驱动器
-
10.7 使用mount命令在Linux上挂载光盘
-
14-傅里叶变换的代码实现-一、numpy实现傅里叶变换和逆傅里叶变换 1.numpy实现傅里叶变换numpy.fft.fft2实现傅里叶变换,返回一个复数数组(complex ndarray),也就是频谱图像numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置) 20*np.log(np.abs(fshift))设置频谱的范围。可以理解为,之前通过傅里叶变换得到复数的数组,是不能通过图像的方法展示出来的,需要转换为灰度图像(映射到[0,255]区间)需要注意的是1> 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的2> 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像3> 在频域对图像进行处理,在频域的处理会反映在逆变换图像上 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) # 移动中心位置 fshift = np.fft.fftshift(f) # 调整值范围 result = 20*np.log(np.abs(fshift)) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.numpy实现逆傅里叶变换numpy.fft.ifft2实现逆傅里叶变换,返回一个复数数组(complex ndarray)numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角iimg = np.abs(逆傅里叶变化结果)设置值的范围,映射到[0,255]区间 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过numpy实现高通滤波,保留图像的边缘信息 获取图像的形状rows,cols = img.shape获取图像的中心点crow,ccol = int(rows/2),int(cols/2)将频谱图像的中心区域(低频区域)设置为0(黑色)fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 高通滤波 rows,cols = img.shape crow,ccol = int(rows/2),int(cols/2) fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 使用numpy实现高通滤波的实验结果: 二、opencv实现傅里叶变换和逆傅里叶变换 1.opencv实现傅里叶变换 返回结果 = cv2.dft(原始图像,转换标识)1> 返回结果:是双通道的,第一个通道是结果的实数部分,第二个通道是结果的虚数部分2> 原始图像:输入图像要首先转换成np.float32(img)格式3> 转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置)调整频谱的范围,将上面频谱图像的复数数组,转换为可以显示的灰度图像(映射到[0,255]区间)返回值 = 20*np.log(cv2.magnitude(参数1,参数2))1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) # 移动中心位置 dftShift = np.fft.fftshift(dft) # 调整频谱的范围 result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1])) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.opencv实现逆傅里叶变换返回结果 = cv2.idft(原始数据)1> 返回结果:取决于原始数据的类型和大小2> 原始数据:实数或者复数均可numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角调整频谱的范围,映射到[0,255]区间返回值 = cv2.magnitude(参数1,参数2)1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftShift = np.fft.fftshift(dft) # 逆傅里叶变换 ishift = np.fft.ifftshift(dftShift) iimg = cv2.idft(ishift) iimg = cv2.magnitude(iimg[:,:,0],iimg[:,:,1]) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("inverse") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过opencv实现低通滤波,模糊一副图像
-
iptv全球直播_使用VLC在macOS上观看IPTV电视
-
如何使用debugfs在Linux上恢复误删文件