优先存储SDCard ,无sdcard存在手机内存中!

2024-02-18 12:32

本文主要是介绍优先存储SDCard ,无sdcard存在手机内存中!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

思路:重写SQLiteOpenHelper  getWritableDatabase和getReadableDatabase方法,子类继承实现

package com.c35.mtd.oa.database;

import java.io.File;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
/**
 * @title: 移动OA
 * @description: sdcard数据库操作类
 * @company: 三五互联
 * @author sunny
 * @version 1.0
 * @created on 2011-4-12
 */
public abstract class SQLiteOpenHelper {

 private static final String TAG = "SDSQLiteOpenHelper";

 private final Context mContext;

 private final String mName;

 private final CursorFactory mFactory;

 private final int mNewVersion;

 private SQLiteDatabase mDatabase = null;

 private boolean mIsInitializing = false;

 public SQLiteOpenHelper(Context context, String name,
   CursorFactory factory, int version) {

  if (version < 1)
   throw new IllegalArgumentException("Version must be >= 1, was "
     + version);

  mContext = context;

  mName = name;

  mFactory = factory;

  mNewVersion = version;

 }

 public synchronized SQLiteDatabase getWritableDatabase() {

  if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {

   return mDatabase; // The database is already open for business

  }

  if (mIsInitializing) {

   throw new IllegalStateException(
     "getWritableDatabase called recursively");

  }

  // If we have a read-only database open, someone could be using it

  // (though they shouldn't), which would cause a lock to be held on

  // the file, and our attempts to open the database read-write would

  // fail waiting for the file lock. To prevent that, we acquire the

  // lock on the read-only database, which shuts out other users.

  boolean success = false;

  SQLiteDatabase db = null;

  try {

   mIsInitializing = true;

   if (mName == null) {

    db = SQLiteDatabase.create(null);

   } else {
    if(SDCardUtils.isSdCard()){//获得SDCard 数据库
     String path = getDatabasePath(mName).getPath();
     db = SQLiteDatabase.openOrCreateDatabase(path, mFactory);
     Log.i("sunny", "create database in sdcard");
    }else{//获得手机数据库
     db = mContext.openOrCreateDatabase(mName, 0, mFactory);
    }
   }

   int version = db.getVersion();

   if (version != mNewVersion) {

    db.beginTransaction();

    try {

     if (version == 0) {

      onCreate(db);

     } else {

      onUpgrade(db, version, mNewVersion);

     }

     db.setVersion(mNewVersion);

     db.setTransactionSuccessful();

    } finally {

     db.endTransaction();

    }

   }

   onOpen(db);

   success = true;

   return db;

  } finally {

   mIsInitializing = false;

   if (success) {

    if (mDatabase != null) {

     try {
      mDatabase.close();
     } catch (Exception e) {
     }

    }

    mDatabase = db;

   } else {

    if (db != null)
     db.close();

   }

  }

 }

 public synchronized SQLiteDatabase getReadableDatabase() {

  if (mDatabase != null && mDatabase.isOpen()) {

   return mDatabase; // The database is already open for business

  }

  if (mIsInitializing) {

   throw new IllegalStateException(
     "getReadableDatabase called recursively");

  }

  try {

   return getWritableDatabase();

  } catch (SQLiteException e) {

   if (mName == null)
    throw e; // Can't open a temp database read-only!

   Log.e(TAG, "Couldn't open " + mName
     + " for writing (will try read-only):", e);

  }

  SQLiteDatabase db = null;

  try {

   mIsInitializing = true;
   String path = "";
   if(SDCardUtils.isSdCard()){//获得SDCard 数据库
    path = mContext.getDatabasePath(mName).getPath();
    db = SQLiteDatabase.openOrCreateDatabase(path, mFactory);
   }else{
    path = getDatabasePath(mName).getPath();
    db = SQLiteDatabase.openDatabase(path, mFactory,
      SQLiteDatabase.OPEN_READWRITE);
   }
   

   if (db.getVersion() != mNewVersion) {

    throw new SQLiteException(
      "Can't upgrade read-only database from version " +

      db.getVersion() + " to " + mNewVersion + ": " + path);

   }

   onOpen(db);

   Log.w(TAG, "Opened " + mName + " in read-only mode");

   mDatabase = db;

   return mDatabase;

  } finally {

   mIsInitializing = false;

   if (db != null && db != mDatabase)
    db.close();

  }

 }

 public synchronized void close() {

  if (mIsInitializing)
   throw new IllegalStateException("Closed during initialization");
  if (mDatabase != null && mDatabase.isOpen()) {
   mDatabase.close();
   mDatabase = null;
  }
 }

 public File getDatabasePath(String name) {
  return new File("/sdcard/" + name);
 }

 public abstract void onCreate(SQLiteDatabase db);

 public abstract void onUpgrade(SQLiteDatabase db, int oldVersion,
   int newVersion);

 public void onOpen(SQLiteDatabase db) {
 }

}

这篇关于优先存储SDCard ,无sdcard存在手机内存中!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络