2016-07-27 72 views
0

专家,如何授予Android API 23的运行时权限?

下面是我的代码,

问题描述:错误发生在db.execSQL声明说,空db对象。

我试着检查是什么错,并且应用了2个烤面包,找出“test”不显示,我的理解就是checkSelfPermission的判断是错误的,所以我已经有了权限。但是,如果我直接写db = SQLiteDatabase.openOrCreateDatabase(),它会有“未知错误(代码14):无法打开数据库”。

我真的没有线索,请帮助,在此先感谢。

ActivityCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED 

代码:

public class AbcActivity extends Activity { 

SQLiteDatabase db; 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    switch (requestCode) { 
     case 111222: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
       db = SQLiteDatabase.openOrCreateDatabase(Global.dataFolder + File.separator + "xxxxx", null); 
      else { 
       System.exit(0); 
      } 
      break; 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_param); 

    if (ActivityCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 
     Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_SHORT).show(); 

     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        111222); 
     else 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        111222); 
    } 
    Toast.makeText(getApplicationContext(), "test2", Toast.LENGTH_SHORT).show(); 

    //db = SQLiteDatabase.openOrCreateDatabase(Global.dataFolder + File.separator + "xxxxx", null); 
    db.execSQL("create table if not exists " + "xxxxx" + "(" + 
      //<editor-fold desc="columns"> 
      "DtdKink REAL," + 
      "TttBin REAL" + 
      //</editor-fold> 
      ")"); 
} 

}

回答

1

我认为这是不具有权限的关系,你应该使用SQLiteOpenHelper类使用SQLite。

例子:

public class FeedReaderDbHelper extends SQLiteOpenHelper { 
    // If you change the database schema, you must increment the database version. 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "FeedReader.db"; 

    public FeedReaderDbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ENTRIES); 
    } 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // This database is only a cache for online data, so its upgrade policy is 
     // to simply to discard the data and start over 
     db.execSQL(SQL_DELETE_ENTRIES); 
     onCreate(db); 
    } 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     onUpgrade(db, oldVersion, newVersion); 
    } 
} 

信息来源:

https://developer.android.com/training/basics/data-storage/databases.html

编辑:

在API 23 openOrCreateDatabase()不能创建,当你试图在创建的文件夹外部存储器,尝试在调用此方法之前执行此操作

检查此解决方案:

File root = new File(Global.dataFolder + File.separator); 
if (!root.exists()) { 
    //Create folder 
    root.mkdirs(); 
} 
db = SQLiteDatabase.openOrCreateDatabase(Global.dataFolder + File.separator + "xxxxx", null); 
       db.execSQL("create table if not exists " + "xxxxx" + "(" + 
       //<editor-fold desc="columns"> 
       "DtdKink REAL," + 
       "TttBin REAL" + 
       //</editor-fold> 
       ")"); 
+0

你能解释一下什么是错的DB = SQLiteDatabase.openOrCreateDatabase说法吗?它在API 21上运行成功。我开始担心,既然你回答,人们会尽管回答,我会等待没有正确的答案。 I – caibirdcnb

+0

openOrCreateDatabase(name,mode,factory)方法在Context类中,所以您应该使用基本活动SQLiteDatabase db = getActivity()。openOrCreateDatabase(“DATABASE”,android.content.Context.MODE_PRIVATE,null); –

+0

对不起,我没有关注。正如我所提到的,代码在API 21上工作。看起来你应该修改db语句,但“test”不执行,意味着没有机会执行“db = SQLiteDatabase.openOrCreateDatabase”。这首先是一个逻辑问题。 – caibirdcnb