【问题标题】:SqliteOpenHelper for Mode_World_Readable, how?Mode_World_Readable 的 SqliteOpenHelper,怎么样?
【发布时间】:2011-03-22 13:46:09
【问题描述】:

SqliteOpenHelper 默认在mode_private 中创建数据库。我们如何使用 SqliteOpenHelper 创建世界可读/可写数据库?

否则我需要使用Context.openOrCreateDatabase()

【问题讨论】:

  • Mhm.. 真的有办法让它在世界上可读吗?在开发指南中写道:SQLite Databases: Store structured data in a *private* database.
  • 是的,如果你引用 Context.openOrCreateDatabase() 它接受世界读/写。但是我找不到使用 SQLiteOpenHelper 的方法,默认情况下通过 0(即 mode_private)

标签: android sqlite database-permissions


【解决方案1】:

我们如何使用 SqliteOpenHelper 创建世界可读/可写的数据库?

我们不能这样做。 ContextImpl.openOrCreateDatabase() 实际上使用 SQLiteDatabase.openOrCreateDatabase() 方法打开/创建数据库,然后使用不属于公共 API 的类 android.os.FileUtils 设置数据库文件的权限。因此,除非您想使用反射,否则使数据库可读/可写的唯一可能方法是使用Context.openOrCreateDatabase()

【讨论】:

  • 如果目标是使用另一个应用程序中的数据库,那么您可能应该使用内容提供程序。
【解决方案2】:

绝对可以将数据库打开为世界可读/可写。但是,数据库的必要性是什么?你可以改用文件..!!

不建议将数据库打开为世界可读/可写。

永远记住这一点:

  • 仅在必要时打开数据库, 因为它很昂贵。

  • 仅在必要的模式下打开 读或写或两者兼而有之。

  • 一旦操作就关闭它 结束了。

如果您想在您的应用程序之间共享数据库或资源,您可以使用 SharedUserID。为了使用 SharedUserID,应用程序必须由相同的 Key 签名。

有关更多信息,请参阅我在 sree.cc 上的帖子

http://sree.cc/google/android/sharing-resources-in-different-aplications-using-shareduserid

这是相同的代码片段:

private void getDB() {
        //accessing file using SHAREDUSERID
        try 
        { 
            //creating context from mainAPP for accessing database
            ctx = createPackageContext(
            "com.schogini.sharedDB.pack",
            Context.CONTEXT_IGNORE_SECURITY);
            if(ctx==null){
                return;
            }
        }
        catch (PackageManager.NameNotFoundException e) { 
            //package not found
            Log.e("Error",e.getMessage());
        }
        try
        { 
            File myDbFile = ctx.getDatabasePath("sharedDB.db");
            if (myDbFile.exists()) 
            {
                dbb = openOrCreateDatabase(myDbFile.getPath(), SQLiteDatabase.OPEN_READWRITE, null);
                dbb.setVersion(1);
                dbb.setLocale(Locale.getDefault());
                dbb.setLockingEnabled(true);
                try{
                    cur=dbb.rawQuery("select * from TABLENAME;",null);
                    try{
                        cur.moveToFirst();
                        int k=cur.getColumnCount();
                        lv_arr=new String[k];
                        for(int i=0;i<k;i++)
                        {
                            lv_arr[i]=""+cur.getString(i);
                            Toast.makeText(LaunchActivity.this, "Data "+i, Toast.LENGTH_SHORT).show();
                        }
                    }
                    catch(Exception e)
                    {
                        //may be an empty database
                        Log.e("Error",e.getMessage());
                        dbb.close();
                    }
                }
                catch(Exception e)
                {
                    Log.e("Error",e.getMessage());
                    dbb.close();
                }
            }
            else
            {
                //database not found
                Toast.makeText(LaunchActivity.this, "DataBase Doesnot Exist", Toast.LENGTH_SHORT).show();
            }
        }
       catch(Exception e)
       {
            Log.i("\n\nTAG",e.toString());
       }
}

不推荐:

如果你想让这个词可读,那么就让它成为世界可读的。使用openFileOutput()openOrCreateDatabase()。将创建数据库的上下文声明为 World 可读。请注意,这种方法无论如何都不安全。

在这里做一个参考。

http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2020-06-18
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多