第五章--数据存储

第五章数据存储

一.数据存储方式

(5种)

二.文件存储

 

 openFileoutput写

openFileInput读

(1)内部存储写操作

将content内容写入fileName文件里,利用openFileOutput要记得要写模式!

(2)外部存储写操作

 

 有四个重要函数

(a)

Evironment.getExternalStorageState()

对于外部存储(SD卡存储)进行写操作时要先获取当前外部设备状态Evironment.getExternalStorageState()

(b).equals(Environment.MEDIA_MOUNTED)

当前外部设备是否可用

如果返回值真那就是可用

最后判断当前android版本号

如果大于29

用getExternalFilesDir(null)

如果小于等于29

用Environment.getExternalStorageDirectory()

 

外部存储SD卡写文件的权限:

 

 

 (3)内部存储读操作

 

 利用android方法openFileInput

先创建输入流FileInputStream 名称=openFileInput(文件名);

byte[]buffer=new byte[缓冲区长度];//缓冲区长度也就是文件长度

然后用缓冲区byte数组存放fis.read(buffer);

最后利用String变量读出!

(4)外部存储读操作

 

利用java的io流进行读

三.sqlite数据库存储

sqlite是一个轻量型数据库是android自带的。

 创建一个MyHelper类继承SQLiteOpenHelper类

在里面重写构造方法(用的是父类构造方法)

重写onCreate方法里面是创建数据库表语句如果有数据库就不用

重写数据库版本号增加(更新数据库)

 完整代码分析:对sqlite增删改查

主活动

数据库bank里面有个account表。

MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {//默认有
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void create(View v){//首先创建数据库对象
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);//这条语句只是创建了helper对象,但是数据库没真创建成功

SQLiteDatabase db = helper.getReadableDatabase();//要调用getReadableDatabase或者getWritableDatabase才会真正使用数据库(前一个只读,后一个只写)
db.close();
}
//增
public void add(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);//bank数据库名称
SQLiteDatabase db = helper.getWritableDatabase();
for(int i=0; i<10; i++){
ContentValues values = new ContentValues();
values.put("name", "person"+i );//用values存放一行记录。第一个参数属性名,第二个参数属性值。
values.put("money", 5000);
long id = db.insert("account",null, values);//插入,(表名,当插入行为空会插入null,插入记录)
}
db.close();
}
public void delete(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
int number = db.delete("account", "_id=?", new String[]{"3"});//删除_id为3的
Log.i("SQLite:", number+"");
number = db.delete("account", "money=?", new String[]{"3000"});//删除money为3000的
Log.i("SQLite:", number+"");
db.close();
}
public void update(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("money", 3000);
int number = db.update("account", values, "name =?", new String[]{"person0"});//将account表里person0的钱改为3000
Log.i("SQLite:", number+"");
values.put("money", 3500);
number = db.update("account", values, "name =?", new String[]{"person6"});
Log.i("SQLite:", number+"");
values.put("money", 6000);
number = db.update("account", values, "name =?", new String[]{"person9"});
Log.i("SQLite:", number+"");
db.close();
}
//查询(只有查询需要自己写log.i()进行显示结果,增删改可以修改后用sql语句在控制台显示)
public void query(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", null, "money=?", new
String[]{"0"},null, null, null);//查询钱为0的全部记录
while (cursor.moveToNext()) {//循环输出
@SuppressLint("Range") int _id = cursor.getInt(cursor.getColumnIndex("_id"));
Log.i("SQLite:", _id+"");
@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
Log.i("SQLite:", name);
@SuppressLint("Range") int money = cursor.getInt(cursor.getColumnIndex("money"));
Log.i("SQLite:", money+"");
}
if (cursor.getCount() == 0) {//假如没有满足条件记录
Log.i("SQLite:", "No such data");
}
db.close();
}//Cursor cursor = db.query("account", null, "money=?",  newString[]{"0"},null, null, null);七个参数
 

 

public void transfer(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();
try {
db.execSQL("update account set money = money-1000 where name =?", new Object[] { "person4" });//名称为person4的记录将钱数-1000
db.execSQL("update account set money = money +1000 where name =?", new Object[] { "person6" });
db.setTransactionSuccessful();
}catch (Exception e) {
Log.i("Transfer failed!", e.toString());//处理异常
} finally {
db.endTransaction();
db.close();
}
}
}
数据库事务

transaction指的是数据库事务-->针对数据库的一组操作
首先开启数据库事务beginTransaction()
然后execSQL(SQL语句对数据库进行操作)
setTransactionSuccessful成功创建数据库事务并做标记
最后在finally里面关闭数据库事务endTransaction();如果有标记那就成功创建数据库事务提交数据,否则失败就回滚。

 

创建数据库类

MyDbHelper.java
package com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class MyDbHelper extends SQLiteOpenHelper {
public MyDbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int
version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE account(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), money INTEGER)");//account是表名,_id为主键且自动增长(从id=1开始)
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
创建数据库类的方法:
先定义这个数据库类他继承SQLiteOpenHelper
然后这个类里面有三个方法
(1)自己的构造方法
public 数据库类名称(Context 名称,String name,SQLiteDatabase.CursorFactory factory,int version)//四个参数分别是上下文名称,数据库名称,游标工厂号一般用null,版本号,除了上下文其他都可以省略。{
super(使用参数的参数值);//按顺序给四个参数赋值,如果在参数列表中没定义就传入一个固定值,否则传入参数名,顺序是从左到右上下文名称,数据库名称,游标工厂号通常为null,最后数据库版本号。
}
(2)onCreate方法
写创建表语句
(3)版本号升级onUpdate(数据库,旧版本号,新版本号)
                                                                                                      总结--对sqlite数据库增删改查
public void 名称(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, 数据库名称, null, 1);////四个参数分别是上下文名称,数据库名称,游标工厂号一般用null,版本号
SQLiteDatabase db = helper.getReadableDatabase();//查询用getReadableDatabase(),增删改用getWritableDatabase()
 ...}
如果想在java中直接用sql语句对数据库操作:

 db是SQLiteDatabase 数据库

 

posted @   Annaprincess  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示