今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了

如何在Window中通过DOM来操作数据库了,如果没有看的同学可以点击一下看看,而这次讲解的是如何通过Android中提供的类来对数据库进行操作

在讲解这个知识点之前我们要列举今天笔记目录,这样也许你看到我的博客就知道我在讲解什么了,同时在移动端的数据保存不当当读写在数据库中,而有时候我们也会对文件

或者有一下XML进行我们的数据存储,我会重文件读写开始然后再到数据的操作,这样我们就能够对Android中数据存储操作有个大概的了解

目录

Android中三种存储方式

1.文件存储:

核心:通过Context类获得openFileInput()和opendFileOutput()之后通过文件流的方式读写数据操作
      两个方法的参数
                               参数1:指定要传入的数据格式:"data"
                              参数2:指定要操作的模式.MODE_PRIVATE和MODE_APPEND
                                        MODE_PRIVATE:是默认模式,当你指定同样的文件名的时候,所写入的数据将会覆盖源文件的内容
                                        MODE_APPEND:而如果文件以存在则会追加原有文件的内容,不存在着创建新的文件

2.SharedPreference存储
                    要通过SharedPreference方式操作数据存储则必须活动SharedPreference对象,获取该对象的方式有三种形式
                       1.Context.getSharedPreference():
                       2.Actvity类中的getPrerence()
                       3.PreferenceManager类中的getDefaultSharedPreference()
                       获取SharedPreference对象之后通过.edit()方法来获得一个SharedPreference.Editor对象
                       然后调用对象中的put方法  然后调用commit()方法则实现数据存储操作

3.数据库存储

认识SQLiteOpenHelper辅助类:借助这个类可以进行数据库创建和升级
                   1.SQLiteOpenHelper是一个抽象类,如果要使用的话则需要通过一个类来继承它,然后重写该类中的onCreate()和onUpgrade()方法
                   2.如果要创建一个数据库着需要调用getReadableDatabase()和getWriteableDatabase(),如果数据库存在着打开,如果不存在着创建一个新数据库 ,

注意,当数据库不可写入时(磁盘空间已满)getReadableDatabase()方法返回的对象将对只读方式打开数据库,而getWriteableDatabase()则会报异常

以上是小编大致列举这篇博客的目录内容,这样好让大家能够明白原来在Android中不往往通过数据库来存放数据的,起码我们要会对文件的读写要有定的认识,那赶紧进入我们学习的内容吧

1.文件存储:

相信大家学习过java的同学对java中的文件输入输出流有大致的认识了,也熟悉的运用过进行文件的读写操作,那在Android中也是同样如此,可以通过输入输出流对我们的文件进行读写操作

1.我们新建一个Android工程,这是必须的

我们通过文件存储方式实现登录保存用户帐号和密码的操作

新建工程完毕之后我们

1.打开我们的layout--->activity_main 布局文件添加两个EditeView控件,并且指定一个唯一Id,一会我们要引用该控件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.filewriteandread.MainActivity"
android:orientation="vertical" > <EditText
android:id="@+id/ed_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入帐号..."
/> <EditText
android:id="@+id/ed_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="请输入密码..."
/> <Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录"
/>
</LinearLayout>

     2.编写我们的控件代码 MainActivity.java 获取我们的控件对象

package com.example.filewriteandread;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText; public class MainActivity extends Activity{ private Button btn1 ;
private EditText ed_name ;
private EditText ed_pass ; //定义一个文件输入流对象
FileOutputStream out = null ;
FileInputStream input = null ;
BufferedReader read = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_name =(EditText)findViewById(R.id.ed_name);
ed_pass = (EditText)findViewById(R.id.ed_pass); btn1 = (Button)findViewById(R.id.btn1);
  } }

    3.给登录按钮绑定一个监听事件,当我们点击该登录操作时就实现数据的保存操作

        btn1.setOnClickListener(new OnClickListener() {

			@Override
public void onClick(View v) {
String name = ed_name.getText().toString() ;
String pass = ed_pass.getText().toString() ;
try {
out = MainActivity.this.openFileOutput("data", MODE_PRIVATE); out.write((name+"##"+pass).getBytes()) ; } catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {e.printStackTrace();}
}
}
});
   openFileOutput("文件名",默认读写形式);

在这里你会看到我不是直接通过new FileOupStream去获取使用文件输出流对象,而是通过上下文对(Activity)来获得的,所以以后想要获得一个输入输出对则可以

通过Context类的openFileInput()和opendFileOutput()方法获得流对象,之后通过文件流的方式读写数据操作

执行以上代码运行,打开DDMS 你会看到你的工程目录下会多一个文件

接下来是读数据了,将读到的数据保存到编辑组件中,我们编写一个readDate()方法,同样通过Context类的openFileInput()获得流对象,之后通过文件流的方式读写数据操作‘

 public void readData(){
FileInputStream input =null;
BufferedReader read = null;
try { input = this.openFileInput("data");
if(input!=null){
//获取一个字符流对象
read = new BufferedReader(new InputStreamReader(input));
String[] str = read.readLine().split("##");
ed_name.setText(str[0]);
ed_pass.setText(str[1]); } } catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
input.close() ;
read.close();
} catch (IOException e) {e.printStackTrace();}
} }

   3.编译运行

package com.example.filewriteandread;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity{ private Button btn1 ;
private EditText ed_name ;
private EditText ed_pass ; //定义一个文件输入流对象
FileOutputStream out = null ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ed_name =(EditText)findViewById(R.id.ed_name);
ed_pass = (EditText)findViewById(R.id.ed_pass);
readData();
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String name = ed_name.getText().toString() ;
String pass = ed_pass.getText().toString() ;
try {
out = MainActivity.this.openFileOutput("data", MODE_PRIVATE); out.write((name+"##"+pass).getBytes()) ; } catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {e.printStackTrace();}
}
}
}); } public void readData(){
FileInputStream input =null;
BufferedReader read = null;
try {
input = this.openFileInput("data");
if(input!=null){
//获取一个字符流对象
read = new BufferedReader(new InputStreamReader(input));
String[] str = read.readLine().split("##");
ed_name.setText(str[0]);
ed_pass.setText(str[1]); } } catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
input.close() ;
read.close();
} catch (IOException e) {e.printStackTrace();}
} } }

        

2.SharedPreference存储方式

其实这种方式和文件存放方式操作一样,只是它生成的文件格式是XMl形式的,往往是以键值对的形式存放数据,我新建一个工程给大家演示一下

这次操作我们就不学匿名内部类的形式了,而这次我写内部类的形式,这样大家就可以知道其实内部类在安卓中运用可多了,内部类有好几种,如果想知道的同学也可以查看一下我的博客内部类的讲解

接下来我定义一个内部类,代码编写如下

class MyBtnListener implements OnClickListener{

    	@Override
public void onClick(View v) {
//获取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString(); SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ; editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
} }

  首先我是通过

PreferenceManager.getDefaultSharedPreferences(MainActivity.this)获取SharedPreferences对象的获取SharedPreferences对象其实不当当这一种,在目录中我也告诉其他几种获取的方式

大家可以尝试一下

再然后我是通过该 对象.edit()获取的SharedPreferences.Editor对象的,这个对象作用相当我们的数据库中JDBC的statement语句对象,用于对数据的封装操作的提供了相应的putXX方法

用于封装不同类型的数据,然后封装完数据后一定要记住要提交事务操作

完整代码如下

package com.example.filewriteandread2;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity { private EditText ed_test1;
private EditText ed_test2;
private Button btn1 ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test1 = (EditText)findViewById(R.id.ed_test1);
ed_test2 = (EditText)findViewById(R.id.ed_test2);
btn1 = (Button)findViewById(R.id.btn_1);
btn1.setOnClickListener(new MyBtnListener()); } class MyBtnListener implements OnClickListener{ @Override
public void onClick(View v) {
//获取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString(); SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ; editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
} }
}

   接下来我们打开DDMS查看一个我们封装的数据

我们导出该文件查询一下,可以点击上面这个按钮哦!

是不是很6呢?哈哈,有同学会问既然能存放这样的数据,那读数据会不会很麻烦呢??其实不然,读数据还简单哦,可以通过PreferenceManager类中的getXXX方法获取哦!

这次我添加一个按钮控件,当你点击按钮操作获得该文件的数据,我们实现一下吧

   <Button
android:id="@+id/btn_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获得数据"
android:onClick="getSomeData"
/>

  

完整代码如下:

package com.example.filewriteandread2;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity { private EditText ed_test1;
private EditText ed_test2;
private Button btn1 ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test1 = (EditText)findViewById(R.id.ed_test1);
ed_test2 = (EditText)findViewById(R.id.ed_test2);
btn1 = (Button)findViewById(R.id.btn_1);
btn1.setOnClickListener(new MyBtnListener()); } class MyBtnListener implements OnClickListener{ @Override
public void onClick(View v) {
//获取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString(); //获取SharedPreferences对象
SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ; editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
} } public void getSomeData(View v){
//获取SharedPreferences对象
SharedPreferences sharePref2 = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
Toast.makeText(this,sharePref2.getString("text1", "") +"---" + sharePref2.getString("text2", ""), Toast.LENGTH_SHORT).show();
} }

    好了,以上就是通过文件进行数据的读写操作了,做了那么多操作,是不是很方便呢?

接下来给大家讲解的就是如何在Android中通过提供的类进行操作数据库了

3.数据库存储

我想大家务必已经对SQLite已经有大致的认识和我在Java中学习的MySQL,Oracle等关系型数据库没什么不同,唯一不同的是它的数据类型,在这小编大致列举几个数据类型有关SQLite的基础学习可以

到菜鸟教程官网进行学习,这样会帮助你更好的了解该知识内容

integer数值型  real浮点类型   blod二进制类型 text文本类型

  接下来我要介绍一下实现的步骤啦

1认识SQLiteOpenHelper辅助类:借助这个类可以进行数据库创建和升级
     2.SQLiteOpenHelper是一个抽象类,如果要使用的话则需要通过一个类来继承它,然后重写该类中的onCreate()和onUpgrade()方法
     3.如果要创建一个数据库着需要调用getReadableDatabase()和getWriteableDatabase(),如果数据库存在着打开,如果不存在着创建一个新数据库 ,

1.定义步骤我们编写一个类型来继承这个辅助类通过重写辅助类的onCreate() onUpgrade()方法实现创建和升级操作

package com.example.databaseoperation;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK ="create table Book ("
+"id integer primary key autoincrement, "
+"bname text,"
+"authod text, "
+"price real, "
+"pages integer)"; private Context mContext ; public MyDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context ;
} @Override
public void onCreate(SQLiteDatabase db) {
System.out.println(CREATE_BOOK);
db.execSQL(CREATE_BOOK);
//创建成功后提示
Toast.makeText(mContext, "数据库和数据库表创建成功",Toast.LENGTH_SHORT).show() ;
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

    解读一下以上代码:第一:我们通过定义一个普通类来继承SQLiteOpenHelper 这个赋值类,然后重写该类中onCreate()和onUpgrade()方法,同时编写一个构造方法用于获得上下文对象,已经传入的要创建的数据库名,和数据库创建的版本号,这样我们就可以创建数据库了,同时创建了一张Book表

2.在MainActivity中调用操作

  //点击时创建数据库操作
btn_create.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
      MyDatabaseHelper bHelper = new MyDatabaseHelper(this,"book.db",null,1);
      dbHelper.getWritableDatabase() ; 
} });

  绑定一个按钮,通过点击按钮则创建数据库

这时候我们就可以通过DOM命令来查询一下我们自己新建的数据库以及表是否存在

我们通过DOM进入该数据查看一下

好接下来我们给该数据库添加数据操作

通过SQLiteDatabase.insert()方法可以添加数据到数据库

//单击添加按钮时去到添加活动中
btn_add.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues() ;
values.put("bname", "This my first Code");
values.put("authod", "yangA");
values.put("price", 30.0);
values.put("pages",3000);
db.insert("book", null, values);
values.clear(); values.put("bname", "This my second Code");
values.put("authod", "yangB");
values.put("price", 40.0);
values.put("pages",1000);
db.insert("book", null, values);
Toast.makeText(DataBaseActivity.this, "添加完毕", Toast.LENGTH_SHORT).show(); } });

   通过一个ContentValues对象进行数据封装然后在执行添加操作也是通过键值的形式存放数据然后变量添加操作

点击添加成功我们可以查询一下数据是否成功添加进去

SQLiteDatabase也提供了相应的updata(),delete() 方法这些方法操作也是非常简单,小编就不再这里演示了,希望大家尝试一下吧,这次的讲解介绍完毕了,下一章将会深入探讨Android中的SQLite操作

敬请期待哦

我的Android六章:Android中SQLite数据库操作的更多相关文章

  1. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  2. iOS 中SQLite数据库操作

    在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 ...

  3. Android中SQLite数据库操作(2)——SQLiteOpenHelper类

    如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...

  4. Android内部自带的SQLite数据库操作dos命令

    1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...

  5. Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操作数据库

    如果开发者对SQL语法不熟,甚至以前从未使用过任何数据库,Android的SQLiteDatabase提供了insert.update.delete或query语句来操作数据库. 一.insert方法 ...

  6. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  7. Android 开发中 SQLite 数据库的使用

    SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...

  8. Android中Sqlite数据库多线程并发问题

    最近在做一个Android项目, 为了改善用户体验,把原先必须让用户“等待”的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. 本人对Java并不 ...

  9. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

随机推荐

  1. android studio...混淆打包全揭秘

    前言,当前android studio使用的版本较新,低版本的如果有差异,或者问题,欢迎拍砖! 1.修改配置文件 找到配置文件,build.gradle,修改如下.    signingConfigs ...

  2. XML小总结

    XHTML 标签都有固定含义,不能去创造新的标签. 而 XML 支持自定义标签,具有扩 展性. 定义 XML 文档结构有两种方法:DTD 和 XSD. XSD 本身就是 XML 文档结构,是继 DTD ...

  3. python学习之 dictionary 、list、tuple操作

    python 内置类型数据 有dictionary(字典).list(列表)和tuple(元组) 一.Dictionary Dictionary 是 Python 的内置数据类型之一,它定义了键和值之 ...

  4. 通过 docker 来搭建 Jenkins

    mkdir /data/jenkins -p mkdir /data/jenkins/{conf,data} -p echo "Asia/Shanghai" > /data/ ...

  5. rm: cannot remove ‘overlay/’: Device or resource busy

    umount /var/lib/docker/overlay #取消挂载就可以啦 rm -rf overlay/

  6. vim字符查找和替换

    一.替换 1. r+<待替换的字母>    将光标处的字母替换为指定的字母 2.R       连续替换直到按下ESC 3.cc      整行替换,并进入插入模式 4.cw     替换 ...

  7. TCP/IP协议理解

    TCP/IP协议理解 一.    协议分层 由于ISO标准中的网络模型是个7层模型,但是由于7层模型对于当时的网络厂商来说太过复杂,很多厂家采用了简化的4层模型来实现网络设备,4层模型也就成了事实的网 ...

  8. 让DOM从页面中消失的方法

    1. 在隐藏的方法中,display取none值这种方法一般是不可取的!因为display:none是直接不显示,也就是不渲染此元素,如果它所作用的元素排版在页面较前,先渲染,就容易引起回流(refl ...

  9. Unity3D架构设计NavMesh寻路

    Unity3D架构设计NavMesh寻路 发表于2013年10月6日由陆泽西 国庆闲来没事把NavMesh巩固一下.以Unity3D引擎为例写一个底层c# NavMesh寻路.因为Unity3D中本身 ...

  10. c++日志练习

    使用ostream流创建写入log日志文件 使用宏 配置文件大小和间隔时间  当创建文件时间间隔或文件大小大于指定数字 则创建新文件 文件名由时间自动命名 /********************* ...