从 Android 内存读取 SQLITE 数据库

2023-12-11

我在 Java 应用程序上创建了一个 sqlite 数据库,并将其推送到我的 android 上。我想读取这个数据库(可能稍后也会写入)。到目前为止,我发现的大多数教程都是在 android 中创建数据库...

我认为我不需要重写 SQLiteOpenHelper 类的 onCreate() 和 onUpdate() 方法,是吗?还有在下面的教程中他创建了表格的部分,因为我已经有了我的数据库

你们可能知道任何教程、示例代码吗?

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "contactsManager";

    // Contacts table name
    private static final String TABLE_CONTACTS = "contacts";

    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NO = "phone_number";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

        // Create tables again
        onCreate(db);
    }

我只需要打开内存中的数据库,对我的数据库执行sql查询并获取结果。


您必须先将数据库从资产复制到设备上的应用程序存储区域(或其他可访问的位置),然后才能使用它。您不能直接从 .apk 文件中使用它。

如何进行的示例:

public class DBAdapter { 

// DB info 
public static final String MAIN_DATABASE_NAME = "yourDB"; 
public static String MAIN_DB_PATH = "/data/data/your.package.name/databases/"; 
public static final int MAIN_DATABASE_VERSION = 1; 

// database control 
private DatabaseHelper mDbHelper; 
private static SQLiteDatabase mDb; 
private static Context mCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context, String dbname, int dbversion) { 
        super(context, dbname, null, dbversion); 
        if (checkDataBase(dbname)) { 
            openDataBase(dbname); 
        } else { 
            try { 
                this.getReadableDatabase(); 
                copyDataBase(dbname); 
                this.close(); 
                openDataBase(dbname); 
            } catch (IOException e) { 
                throw new Error("Error copying database"); 
            } 
            Toast.makeText(context, 
                    "Initial " + dbname + " database has been created", 
                    Toast.LENGTH_LONG).show(); 
        } 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

public DBAdapter(Context ctx) { 
    DBAdapter.mCtx = ctx; 
} 

public DBAdapter open(String dbname, int dbversion) throws SQLException { 
    mDbHelper = new DatabaseHelper(mCtx, dbname, dbversion); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDbHelper.close(); 
} 

private static void copyDataBase(String dbname) throws IOException { 
    InputStream myInput = mCtx.getAssets().open(dbname); 
    String outFileName = MAIN_DB_PATH + dbname; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
        myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

private static boolean checkDataBase(String dbname) { 
    SQLiteDatabase checkDB = null; 
    boolean exist = false; 
    try { 
        String db = MAIN_DB_PATH + dbname; 
        checkDB = SQLiteDatabase.openDatabase(db, null, 
                SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
        Log.v("db log", "database does't exist"); 
    } 
    if (checkDB != null) { 
        exist = true; 
        checkDB.close(); 
    } 
    return exist; 
} 

private static void openDataBase(String dbname) throws SQLException { 
    String dbPath = MAIN_DB_PATH + dbname; 
    mDb = SQLiteDatabase.openDatabase(dbPath, null, 
            SQLiteDatabase.OPEN_READWRITE); 
} 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Android 内存读取 SQLITE 数据库 的相关文章

随机推荐

  • 检查有效的 html C#

    C 中是否有一种简单的方法来验证 html 文件 htm 你可以试试这篇文章C 验证 XHTML在 Dot Net Perls 上 如果您不习惯在 C 中执行此操作 那么通常验证 HTML 的最佳方法是使用W3C 验证服务 当然 如果对您的
  • Groovy 脚本获取请求 xml

    我可以使用 Groovy 脚本获取响应 xml 我需要获取请求 XML 因为我需要将 断言脚本 添加到我的soap ui 测试中 我使用以下代码来获取响应 xml def response new XmlHolder messageExch
  • python win32print 不打印

    我需要直接打印一些信息 无需用户确认 并且我正在使用 Python 和win32print模块 我已经读完了全文蒂姆 戈尔登 win32打印页 甚至阅读win32打印文档 很小 我使用的是他自己在那里写的相同示例 但我什么也没打印 如果我进
  • oracle rowid 内部是如何生成的?

    我想知道oracle中的ROWID是增量生成的吗 如果我尝试下面的查询 select min ROWID from table 我是否总是会获得表中第一个插入行的 ROWID 还是最终可能会获得任何随机行的 ROWID 如果有人能阐明这一点
  • 如何有选择地转义 Python 字符串中的百分比 (%)?

    我有以下代码 test have it break selectiveEscape Print percent in sentence and not s test print selectiveEscape 我想得到输出 Print pe
  • NHibernate SchemaExport 和Configure() catch-22

    我想用DDD在一个新项目中 首先对我的类进行建模 然后根据类库生成数据库模式 我的计划是使用 NHibernate hbm2ddl 工具来完成此操作SchemaExport 问题是我无法得到SchemaExport因为一个奇怪的第 22 条
  • 使用 Mongoose 填充其他集合中的记录计数

    我有 2 个 Mongoose 模型 Book 和 Users 我想这样做 当查找一本书时 我想获取当前图书用户的数量 这是书籍模型 var mongoose require mongoose var Users require users
  • 使用 Spring Boot 时出现 403,但与邮递员配合良好[重复]

    这个问题在这里已经有答案了 我在 url 上使用邮递员进行 api 调用 https cex io api order book BTC USD 普通 GET 没有标头 没有参数 什么也没有 但对于java也是一样 RestTemplate
  • Django Oscar 更改 URL 模式

    我已经设置了 django oscar 项目 并且正在尝试配置 U RL 我的目标是改变 catalogue to catalog 根据我添加的文档app py in myproject app py myproject app py fr
  • 访问 ANTLR 4 中的通道并单独解析它们

    我已将我的评论添加到 ANTLR 4 中的一个单独频道中 在我的例子中 它是频道 2 这是我的词法分析器语法 COMMENT gt channel 2 我想访问这个频道 2 并在这个频道上进行解析以积累评论 所以我将其包含在解析语法中 如下
  • 服务器不愿意处理请求

    我正在尝试使用 powershell 在名为 Branches 的 OU 下添加名为 Calder 的 OU 但我不断收到错误New ADOrganizationalUnit The server is unwilling to proce
  • IOS 中的 HTTPS post 请求

    我尝试使用以下代码发出 https post 请求 NSURL url NSURL URLWithString https portkey formspring me login initialize a request from url
  • CopyFileEx 具有多个文件,但只有一个复制对话框

    我已经在网络和 stackoverflow 上搜索过这个 我想将多个文件从多个源复制到多个目标 我还没有为 UnauthorizedAccessExceptions 烦恼 这些文件很可能无论如何都不会被使用 我可以使用 CopyFileEx
  • 如何在 VBA 中从两个范围创建一个范围?

    我有两个范围 每个范围包含一个单元格 例如 A1 和 C3 如何获得包含这两个之间的所有单元格的新范围 A1 C3 我试过这个 Set NewRange Range Range1 Address Range2 Address 另外 如何设置
  • 如何根据最后一个命令的退出代码更改 bash 提示颜色?

    如果之前的退出代码为 0 我想显示绿色笑脸 如果不成功则显示红色笑脸 基本上我想做这个提示 但还包括其他东西 PS1 u h w if 0 then echo e 32m e 37m else echo e 31m e 37m fi 我想将
  • org.hibernate.PersistentObjectException:传递给持久化的分离实体

    我已经成功地用 hibernate 编写了我的第一个主子示例 几天后我又拿了它并升级了一些库 不知道我做了什么 但我再也无法让它运行了 有人可以帮我找出返回以下错误消息的代码有什么问题吗 org hibernate PersistentOb
  • 将负数分配给无符号整数?

    在 C 编程语言中 unsigned int仅用于存储正值 但是 当我运行以下代码时 unsigned int x 12 printf d x 输出仍然是 12 我认为它应该打印出 12 或者我误解了什么 The 12等号右侧设置为有符号整
  • Vega-lite 条形图条形之间的空间

    D3新手 如何调整 vega lite 条形图中条形之间的间距并覆盖默认值 binSpacing 我认为只适用于直方图 请参阅下面的代码 我也想调整文本和字体系列的颜色 但我在文档中找不到它 schema https vega github
  • 如何获取转换后的 Windows 应用商店 UWP 应用程序的故障转储(或任何可用的故障报告)?

    我向 Windows 10 Store 提交了我的nativeWin32 应用程序是转换为 UWP应用程序使用Project Centennial转换器 该应用程序通过了商店认证 可以通过私人链接使用 当我测试它时 在运行我的测试时 应用程
  • 从 Android 内存读取 SQLITE 数据库

    我在 Java 应用程序上创建了一个 sqlite 数据库 并将其推送到我的 android 上 我想读取这个数据库 可能稍后也会写入 到目前为止 我发现的大多数教程都是在 android 中创建数据库 我认为我不需要重写 SQLiteOp