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

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

  1. OpenResty学习中的几个小例子汇总

    1.测试lua或是LuaJIT的版本号 如果使用的是标准 Lua,访问 /lua-version 应当返回响应体 Lua 5.1 如果是 LuaJIT 则应当返回类似 LuaJIT 2.0.2 这样的 ...

  2. 深度学习中的单阶段小目标检测方法综述

    随着深度学习的不断发展,目标检测技术逐步从基于传统的手工检测方法向基于深度神经网络的检测方法转变.在众多基于深度学习的目标检测方法中,基于深度学习的单阶段目标检测方法因其网络结构较简单.运行速度较快以 ...

  3. 说说学习中的那点小焦虑

    说到焦虑,成了当下年轻人生活中的标配,感觉自己稍不留神就会被同龄人抛弃,被这个时代淘汰.就像现在的学习.生活,也是各种充斥着无处不在的小焦虑.营销号热衷制造焦虑,然后贩卖焦虑,收获流量和粉丝.也有一部 ...

  4. 深度学习中benchmark什么意思,例子

    在深度学习中,"benchmark"通常指对不同的模型.算法或硬件进行性能测试和比较的过程.具体来说,benchmark可以帮助研究人员确定一个模型或算法的优劣,或者在不同的硬件平 ...

  5. 华为手机点击android棒棒,华为手机中不为人知的按钮,小功能,大作用,不知道就太浪费了!...

    功能1:小红点去除 手机是我们天天上都在接触的,每次打开手机总是会发现很多功能按钮上都有小红点的出现,看着不是很舒服,所以一般情况下都会点击这个小红点看一看,特别是对于有强迫症的朋友来说,有这个小红点 ...

  6. android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)

    原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...

  7. 如何写第一篇论文-深度学习中创新点比较小,但是有效果,可以发(水)论文吗? - 王晋东不在家的回答 - 知乎

    作者:王晋东不在家 链接:https://www.zhihu.com/question/528654768/answer/2452424449 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...

  8. MonoRail学习笔记一:一个小例子

    随着微软放出消息,准备发布MVC的框架,各种议论纷至沓来. 以前用java.jsp对它的MVC结构.集中控制印象特别深刻,自从用了.NET后,虽然webform的控件很好用,总感觉有点怪怪的 在网上搜 ...

  9. 数组对称_对称性应用在物理中的几个小例子

    在我刚读物理专业时,看到各类科普书都在或多或少吹嘘爱因斯坦是如何地相信对称性,对称性对物理产生了如何巨大的影响,那时候实在无法理解对称性是如何影响物理学,为什么说有了洛伦兹不变形就有了狭义相对论.在学 ...

最新文章

  1. 判断线程是否执行完毕_关于线程池你不能不知道的东西
  2. 我三年开发经验,从字节跳动抖音离职后,原理+实战+视频+源码
  3. Tomcat源码学习(4)-How Tomcat works(转)
  4. 查看手机截图的坐标信息
  5. 图像“位操作”有什么用?
  6. 运行时常量池_从String的intern()到常量池
  7. URI和URL的区别(12万访问量)
  8. java 匿名初始化_Java:双括号初始化 /匿名内部类初始化法
  9. 突破XXX,冲上Google+
  10. FPGA丨图像二值化
  11. 惠普打印机m226dn教程_惠普m226dn说明书
  12. iOS系统安全学习小结(一)
  13. 谷歌AI人工智能:我们的原则
  14. 墨尔本python培训班_墨的解释|墨的意思|汉典“墨”字的基本解释
  15. SAP FICO 固定资产的四种折旧方式
  16. 如何删除Mysql注册列表残余文件
  17. ZCMU - 1601: 卡斯丁狗去挖矿
  18. C进阶⚡- 05动态内存管理
  19. 做了一个pichome的windows绿色版,解压即用,方便快速测试。
  20. [蓝桥杯]最后十天,冲刺进国赛

热门文章

  1. AjaxControlToolkit的使用
  2. 浪客剑心:位图法Bitmap算法分析
  3. 研究人员发现:基于文本的AI模型容易受到改述攻击
  4. 快速通读《现代软件工程——构建之法》
  5. const指针和指向常量的指针
  6. 《HTML5 Canvas游戏开发实战》——2.1 绘制基本图形
  7. EDM营销之如何使邮件列表更加有效
  8. 面试中关于Java你所需知道的的一切
  9. Innodb ibdata数据文件误删,如何恢复
  10. 持久代是方法区还是堆中的?