بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
مشکل دیتابیس sqlite در اندروید 6
با سلام. من روی اندروید 6 برنامه ساخت دیتابیس رو اجرا کردم و کرش کرد و همونو در اندروید 5 اجرا کردم و کار کرد.
کدها
package aryan.mohammadamin.testgradle;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.File;
public class ActivityMain extends AppCompatActivity {
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE = DIR_SDCARD + "/Android/data/test";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new File(DIR_DATABASE).mkdirs();
database = SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + "/database.sqlite", null);
database.execSQL("CREATE TABLE IF NOT EXISTS users (" +
"sql_id INTEGER NOT NULL ," +
" sql_name VARCHAR NOT NULL ," +
" sql_email TEXT NOT NULL ," +
" sql_password TEXT NOT NULL )");
database.execSQL("INSERT INTO users (sql_id,sql_name,sql_email,sql_password) VALUES (0,'0','0','0')");
}
}
ارور های logcat
07-02 18:18:43.216 2483-2483/aryan.mohammadamin.testgradle E/AndroidRuntime: FATAL EXCEPTION: main Process: aryan.mohammadamin.testgradle, PID: 2483 java.lang.RuntimeException: Unable to start activity ComponentInfo{aryan.mohammadamin.testgradle/aryan.mohammadamin.testgradle.ActivityMain}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:709) at aryan.mohammadamin.testgradle.ActivityMain.onCreate(ActivityMain.java:24) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
خواهش میکنم کمکم کنید.
با تشکر.
برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال
amirhossein1376
8 سال پیش
+2
0
اگه targetSdkVersion شما روی 23 (اندروید 6) باشه توی فایل گریدل باید پرمیشن مربوطه رو runtime بگیرید یعنی از اندروید 6 به بعد برای یه سری پرمیشن ها مثل نوشتن روی کارت حافظه و یا خوندن مخاطب ها باید موقع اجرای برنامه هم این پرمیشن دریافت بشه برای اینکار کد زیر رو قبل از ایجاد فایل و بعد setContentView اضافه کنید
---------------------------------------------------------------ویرایش
البته ساده تر اینه که فعلا میتونید targetSdkVersion رو روی 22 ست کنید تا فعلا مشکلی پیش نیاد ولی موقع ریلیز برنامه باید همین کارو بکنید
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
final int REQUEST_CODE_ASK_PERMISSION = 123;
int hasReadContactsPermission =
ContextCompat.checkSelfPermission(MainActivity.this, permissions[0]);
if (hasReadContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CONTACTS)) {
ActivityCompat.requestPermissions(MainActivity.this, permissions, REQUEST_CODE_ASK_PERMISSION);
return;
}
}
ActivityCompat.requestPermissions(MainActivity.this, permissions, REQUEST_CODE_ASK_PERMISSION);
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .