在Android初次的前期学习中的二个小例子(2)

Hello13:SQLite数据库

一、简述SQLite的概念和主要特性
  1. SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,使用非常方便,支持SQL语法标准和数据库事务原则。
  2. 相对于SharedPreferences使用文件保存数据,SQLite具有处理复杂数据结构的能力。
  3. SQLite支持五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象)。
  4. 最大的特点:各种数据类型的数据保存到任何字段中而不用关心字段声明的数据类型,除了声明为主键INTEGER PRIMARY KEY的字段只能够存储64位整数。
  5. 保存目录为内部存储:data/data/包名/databases下
二、提供操作SQLite的相关类
类名
作用
描述
SQLiteOpenHelper类
抽象类
通过继承该类,可重写数据库创建OnCreat()与更新onUpdate的方法。
通过子类的对象,可使用方法获得SQLiteDatabase类的对象。
SQLiteDatabase类
数据库访问类
通过该类的对象,可对数据库进行增删改查的操作
Cursor
游标
可以简单理解为指向数据库中某 一个记录的指针
三、继承SQLiteOpenHelper类需要覆写的方法说明
1.onCreate(database) 
SQLiteOpenHelper会自动检测数据库文件是否存在。如果存在就不会调用onCreate()方法;如果不存在就会调用onCreate()方法。(用通俗的语言来说,就是onCreate()方法在数据库文件第一次创建时调用。)
2.onUpgrade(database,oldVersion,newVersion)
在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。
四、创建流程
Step 1:自定义一个类继承SQLiteOpenHelper类 
Step 2:在该类的构造方法的super中设置好要创建的数据库名,版本号 
Step 3:重写onCreate( )方法创建表结构 
Step 4:重写onUpgrade( )方法定义版本号发生改变后执行的操作
代码如下:
public class DBHelper extends SQLiteOpenHelper {public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, null, 1);Log.i("1","初始化完成!");    //后台输出到日志
}//数据库第一次创建时被调用
    @Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL("CREATE TABLE person(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))");Log.i("1","新建数据库成功!");}//软件版本号发生改变时调用
    @Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {sqLiteDatabase.execSQL("ALTER TABLE person ADD phone VARCHAR(12)");Log.i("1","更新数据库成功!");}
}

        调用SimpleCursorAdapter游标适配器时,需要数据的主键为“_id”(注意下划线)

五、调用SQLiteOpenHelper的子类
代码如下:
public class MainActivity extends Activity {private Context mContext;/**
* Content的意思为“上下文”,它是抽象类的基类,我们一般见到的Activity、Service和Application都是ContextImpl类。
* 需要指明的是: Context提供了一个应用的运行环境,在Context的大环境里,应用才可以访问资源,才能完成和其他组件、服务的交互.
* 所以:假设在Activity中需要调用时,在类的成员变量中加入mContext,并初始化为Activity的本身this。
*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = MainActivity.this;DBHelper dbHelper = new DBHelper(mContext,"my_db",null ,1);SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); //onCreate()和onUpgrade()被调用
    }
}

 


Hello14:Camera相机的操作(案例如果出现异常,请Rebuild Project一下)
一、打开系统的照相机
    1.调用系统相机的操作比较简单,但是我们记忆的一个是步骤,而不是代码。所以先给出步骤描述:
使用Intent调用系统相机,相机拍照后,会返回一个Intent给onActivityResult。在Intent的extra部分包含刚刚拍照的编码过的Bitmap。
Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    //调用系统相机startActivityForResult(it,Activity.DEFAULT_KEYS_DIALER);            //拍照完成后,自动返回Intent给onActivityResult//重写onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if(requestCode == Activity.RESULT_OK){            //返回结果正常Bundle bundle = data.getExtras();                    Bitmap bitmap = (Bitmap) bundle.get("data");        //获取Bitmap
        img_show.setImageBitmap(bitmap);}
}

    2.使用资源定位Uri和文件File的操作,把图片保存下来

//打开系统相机
private void openSystemCamrea() {Intent intent = new Intent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//原图保存File file = new File(getExternalFilesDir(""),"photo.jpg");Uri uri = Uri.fromFile(file);                                                  //file的唯一资源标识符uriintent.putExtra(MediaStore.EXTRA_OUTPUT,uri);              //使用intent连接照相机的输出到uristartActivityForResult(intent,1);                                             //调回函数onAtcitivyResult(),requestCode标识该调回
}@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if(resultCode == RESULT_OK) {switch (requestCode) {case 1://显示图片/*Bitmap bitmap = (Bitmap) data.getExtras().get("data"); //获取返回结果的缩略图mImageView.setImageBitmap(bitmap); //使用ImageView显示位图*///保存图片,由于图片较大,保存在外部存储,路径为storage/emulated/0/Android/data/files下File file = new File(getExternalFilesDir(""), "photo.jpg");Bitmap bitmap = null;try {bitmap = BitmapFactory.decodeStream(new FileInputStream(file));} catch (FileNotFoundException e) {e.printStackTrace();}if (bitmap != null) {mImageView.setImageBitmap(bitmap);}break;}}
}

 

二、打开我的自定义照相机
详情见项目,这里提供一个链接,我是根据这个写完自定义相机的。http://www.runoob.com/w3cnote/android-tutorial-camera.html
效果预览图如下:

然而重点来了!!!在这里先申明一下下面是踩过的坑:
坑1:android系统相机权限兼容问题
在一般情况下,上述代码运行没有任何问题;可是当把targetSdkVersion指定成24及之上并且在API>=24的设备上运行时,会抛出异常:这是因为在Android6.0之后引入运行时权限,如果接收file://Uri的app没有申请READ_EXTERNAL_STORAGE权限,在读取文件时会引发崩溃。总而言之,就是Android不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。
所以解决方案:https://blog.csdn.net/android_an/article/details/77506915 (android 7.0 因为Uri.fromFile引起的FileUriExposedException异常 见此网页)
详情请见项目的OpenUpdateCamera()方法、res/xml/share_paths.xml文件和onActivityResult()方法
坑2:没有FileProvider包,加入包后没有R资源或APPT2异常! 
修改后的代码见原文件,如果出现异常,请Rebuild Project一下(点击标题下载)

转载于:https://www.cnblogs.com/jdemarryme/p/9292057.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

access 增加字段 工具_Java效率工具之Lombok

作者:LiWenD正在掘金来源:https://juejin.im/post/5b00517cf265da0ba0636d4b上一篇:数据库查询速度优化之解决技巧还在编写无聊枯燥又难以维护的POJO吗?洁癖者的春天在哪里?请看Lombok!在过往的Java项目中&…

一文读懂 | 进程并发与同步

并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图(图片来源于网络):concurrency-parallelism上图的意思是&a…

rust卡领地柜权限_RFID智能医疗耗材柜,上海智能高值耗材柜,国药智能医用耗材柜...

近几年因为我们的医疗改革一直在进步并改革,国家对我们的医疗方面的补助也有了明显的加大投入,与此同时让各种公立私立医院如雨后春笋般层出不穷,各大医院为了在医疗市场占有一席之地,都在各个方面开始想办法提升自己医院的水准。…

刚接触电子时,有过哪些百思不得其解的问题?

青少年时期,刚接触电子时,出于好奇,对这方面的东西也比较关注,但同时也衍生了一些百思不得其解的疑问,比如...01物理书里说大地是导体,那为什么我的小灯珠却不亮!?02初三时学了物理的…

建立管理SQL Server登录帐户

1、打开SQL Server 2005的管理工具,选择以windows身份验证模式登陆。然后右击服务器选择属性。2、在打开的服务器属性页面中,选择“安全性”做如下图设置:3.在windows上新建三个组:ReceptionEmployees,ITEmployees。4、然后在SQL …

c++ doxygen 注释规范_利用Doxygen给C程序生成注释文档

利用Doxygen为C程序生成注释文档一、Doxygen工具的安装利用Doxygen工具生成API帮助文档需要下载安装以下三个软件:(1)Doxygen:可以从一套归档源文件开始,生成HTML格式的在线类浏览器,或离线的LATEX、RTF参考手册。本文中所使用的版…

【2021新版】一线大厂 Go 面试题合集

秋天到了,又到了工程师们躁动不安,蠢蠢欲动的季节~这不,金九银十已然到了家门口,现在后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备Go 开发前景如何啥样的后端适合切 Go 技术栈...面试…

python开发【基础二】

基本数据类型: 1、数字 在Python2中,分为整形(int)和长整形(long)。 在Python3中,都是int。 #1、将字符串转换为数字 a "123" v int(a) print(v) print(type(v))#2、当前数字的二进制,至少用几位表示 1位等于8个字节.…

can总线资料

应知识星球的同学要求,整理了一些can总线资料。在公众号后台回复 【can总线】获取资料截图推荐阅读:专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈

Go语言基础之4--流程控制

一、if else语句 1.1 基本语法1 语法1: if condition { //do something } 语法2: if condition { //do something } else { //do something } 语法3: if condition { //do something } else if condition { //do something } else { //do som…

大家都挺难的​

这是昨天小号发的一个推文小时候觉得读书苦 但是现在想想,如果那时候跟现在一样用功 考上北大清华都没问题然后想到跟我家小云聊天的内容,挺有感触的。小云最近在我们小区的业委会上班,业委会在我家旁边,上班就是从这栋楼到另一栋…

android handler封装_Handler都没搞懂,你拿什么去跳槽啊?!

0. 前言做 Android 开发肯定离不开跟 Handler 打交道,它通常被我们用来做主线程与子线程之间的通信工具,而 Handler 作为 Android 中消息机制的重要一员也确实给我们的开发带来了极大的便利。Handler应用之广泛,可以说只要有异步线程与主线程…

做梦也想有一个这样的实验室

从现在开始,努力攒钱,等有钱了,自己也开一个这样的实验室。推荐阅读:专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号,后台回复「1024」获取学习资料网盘链接。欢迎点赞,关注&#xff…

努力过头了,其实并不好

昨天下午下班的时候,有一个读者朋友找我聊天。我再说下聊天这个事情,如果大家有事情,可以在群里艾特我,因为重要的群我会置顶,置顶的群我会看消息,你在群里艾特我我一定能看到。当然,在群里发一…

jstack 脚本 自动日志_GitLab从安装到全自动化备份一条龙

原文地址[1]欢迎star需求1.在新服务器上安装并搭建好gitlab2.手动自动将旧服务器上的gitlab备份3.手动自动将gitlab备份包scp到新服务器上4.手动自动恢复新服务器上的gitlab备份包5.在新旧服务器上自动删除过期备份包前提1.版本•gitlab-ce是社区版•gitlab-ee是企业版1.方案•…

纪念音视频界前辈-雷霄骅

这是一篇记录文,纪念一位在音视频领域研究的博士雷霄骅。雷霄骅生前是中国传媒大学通信与信息系统博士在读生,于2016年7月17日凌晨猝死在学校主楼五层,10月就将迎来自己26岁的生日。雷霄骅在音视频领域有很深的造诣和贡献,指导了很…

gcc和g++有什么区别?

来源 | C语言中文网发展至今,GCC 编译器已经更新至 V10 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C 。除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objectiv…

druid删除数据_Apache druid 删除数据流程 0.13

背景由于前端时间数据导入出现问题,导致druid 中的数据需要重新导入,但又要防止数据重复,需要把数据彻底清理。问题由于druid 属于时间序列数据库,删除的时候只能时间范围删除。删除流程根据时间范围查询segements 标识(在coordinator节点查询…

使用C语言扩展Python(四)

上一篇里的LAME项目已经展示了python如何与C语言交互,但程序仍不够理想,在python这一端仅仅是传递源文件和目标文件的路径,再调用C模块的encode方法来进行编码,但问题在于你无法控制encode函数,比如你想编码的源文件如…

案例 github_2019年12月Github上最热门的Java开源项目,速来围观!

转眼之间,已经进入了2020年,2019年发生的一切仿佛就在昨天。那么,刚过去不久的12月份GitHub上最热门的Java开源项目排行已经出炉啦。下面我带大家一起来看看上榜详情:1、Alinkhttps://github.com/alibaba/Alink Star 1695Alink 是…