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

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性