优先存储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

相关文章

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的