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","初始化完成!"); //后台输出到日志
} //数据库第一次创建时被调用
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("CREATE TABLE person(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))");
Log.i("1","新建数据库成功!");
}
//软件版本号发生改变时调用
@Override
public 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。
*/
@Override
protected 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的唯一资源标识符uri
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri); //使用intent连接照相机的输出到uri
startActivityForResult(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()方法
 
修改后的代码见原文件,如果出现异常,请Rebuild Project一下(点击标题下载)

 
 
 
 

在Android初次的前期学习中的二个小例子(2)的更多相关文章

  1. 在Android初次的前期学习中的十二个小例子(附案例下载)

    目录(点击标题即可下载): Hello:使用Intent在两个Activity之间切换 Hello2:实现特定的鼠标点击事件功能 Hello3:点击监听事件集中处理 Hello4:登录注册界面布局 H ...

  2. 记录Python学习中的几个小问题

    记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...

  3. 【Android群英传】学习笔记(二)

    在本篇笔记中,小编将记录关于Android Studio使用过程的小技巧 在下面文章为Android Studio 简称As ① 使用Android Studio第一次创建项目等待时间很长? 原因: ...

  4. Android 学习第3课,小例子

    package temperature.convert; import java.util.Scanner; public class Converter { public static void m ...

  5. JSTL中的fmt标签小例子

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  6. js中的json的小例子

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  7. node中的ajax提交小例子

    我们看一个HTML5页面中通过AJAX请求的方式获取HTTP服务器返回数据的代码示例.由于我们把服务器的端口指定为1337,并将从端口为80的网站中运行HTML5页面,因此这是一种跨域操作,需要在HT ...

  8. verilog学习笔记(3)_task/case小例子及其tb

    module ex_case `timescale lns/1ns module ex_case( input wire rst_n, input wire sclk, output reg [7:0 ...

  9. 【学习备份】ajax添加小例子

    实现目的:保存模板编号.模板名称到数据库 1.js引用 <script src="../../../../../../../js/jquery-1.10.2.min.js"& ...

随机推荐

  1. 7.Bconsole操作

    1.   Bconsole操作 启动控制台 cd /usr/local/bacula/bin ./bconsole *help Command       Description =======    ...

  2. httpd安装mod_jk模块

    1.1 使用yum安装的httpd安装mod_jk模块 mod_jk模块下载地址官网 安装httpd和httpd-devel(这个包会有apxs必须要有的) [root@apache ~]# yum ...

  3. 按照教程自动安装RFNoC时.在使用pip安装pybombs时出现报错,解决办法

    $ sudo apt-get install git $ sudo apt-get install python-setuptools python-dev python-pip build-esse ...

  4. Nginx之什么是反向代理(一)

    什么是反向代理? 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  5. 218多校第九场 HDU 6424 (数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6424 题意:定义f(A) = log log log log …. (A个log) n ,g[A,B, ...

  6. Vivado与Modelsim联合仿真

    [转载]: 1:https://blog.csdn.net/weixin_37603007/article/details/82823965 2:https://blog.csdn.net/Piece ...

  7. 如何从word中直接复制图片到编辑器中

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  8. Word:自动编号超过9后缩进太大

     造冰箱的大熊猫,本文适用于Microsoft Office 2007@cnblogs 2019/7/30 文中图片可通过点击鼠标右键查看大图 1.场景 如下图所示,使用Word的自动编号功能时,当编 ...

  9. tensorflow实现siamese网络 (附代码)

    转载自:https://blog.csdn.net/qq1483661204/article/details/79039702 Learning a Similarity Metric Discrim ...

  10. When you want to succeed as bad as you wanna breathe, then you’ll be successful.

    上周末登了次山,回来就各种矫情犯懒.今天周四一周又要完蛋,我发现自己真的是对时间流逝无可奈何.然后中午看了把小码哥网站还有MJ博客什么的,各种首期班大爆照,心中羞愧无比.年纪大也不能放弃自己啊,要不人 ...