بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
error for database(Can not open Database)
با سلام کسی میتواند کمکم کند چطوری این ارور برطرف کنم ؟؟ ممنون
اینم منیفست :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ahEngineer.programming.create">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application
android:name=".G"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
این ارور
: (14) cannot open file at line 36667 of [0c55d17973]
E: (14) os_unix.c:36667: (2) open(/storage/emulated/0/ahengineer/clculator_database/db/calHistory.sqlite) -
E: Failed to open database '/storage/emulated/0/ahengineer/clculator_database/db/calHistory.sqlite'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:211)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:195)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:503)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:204)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:196)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:880)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:865)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:729)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:355)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:298)
at calculator.framework.core.HBase.createAppDirectory(HBase.java:64)
at calculator.calculator10.calculator.StandardActivity$1.onGranted(StandardActivity.java:118)
at calculator.framework.helper.PermissionHelper.onRequestPermissionResult(PermissionHelper.java:62)
at calculator.calculator10.calculator.StandardActivity.onRequestPermissionsResult(StandardActivity.java:383)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7601)
at android.app.Activity.dispatchActivityResult(Activity.java:7452)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4365)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4414)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6649)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
کلاس اصلی
public class StandardActivity extends AppCompatActivity {
private void requestForWriteSdcardPermission(){
PermissionHelper permissionHelper = new PermissionHelper(this);
permissionHelper.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, new PermissionHelper.OnGrantedListener() {
@Override
public void onGranted() {
HBase.base.createAppDirectory();
Toast.makeText(StandardActivity.this, "Granted For write external storage", Toast.LENGTH_SHORT).show();
}
}, new PermissionHelper.OnDeniedListener() {
@Override
public void onDenied() {
new AlertDialog.Builder(StandardActivity.this)
.setTitle("Permission Required")
.setMessage("In order for the application to work properly, you must issue a license to access external memory to store application information")
.setPositiveButton("Ask me Again", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestForWriteSdcardPermission();
}
})
.create()
.show();
}
},new PermissionHelper.OnAlreadyGrantedListener() {
@Override
public void onAlreadyGranted() {
HBase.base.createOrOpenDatabase();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.setContentView(R.layout.activity_enhanced);
requestForWriteSdcardPermission();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
PermissionHelper.onRequestPermissionResult(requestCode, permissions, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
همان کلاس G
public class HBase extends Application {
public static final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String BRAND_DIR = SDCARD + "/ahengineer";
public static final String APP_DIR = BRAND_DIR + "/clculator_database";
public static final String DB_DIR = APP_DIR + "/db";
public static SQLiteDatabase database;
public static HBase base;
@Override
public void onCreate() {
super.onCreate();
base = this;
}
public void createAppDirectory() {
File dbDir = new File(DB_DIR);
if (!dbDir.exists()) {
dbDir.mkdirs();
}
createOrOpenDatabase();
}
public void createOrOpenDatabase() {
if (database != null) {
return;
}
CreateDatabaseHelper dbHelper = new CreateDatabaseHelper(this);
database = dbHelper.getWritableDatabase();
}
اینم کلاس ساخت database
public class CreateDatabaseHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "History.sqlite";
public static final int DB_VERSION = 1;
public CreateDatabaseHelper(Context context) {
super(context, HBase.DB_DIR + "/" + DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
createDatabase(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion == 2) {
createDatabase(db);
}
}
private void createDatabase(SQLiteDatabase db){
String query =
"CREATE TABLE 'history' (" +
"'numberId' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , " +
"'resultNumber' TEXT, " +
"'historyNumber' TEXT" +
")";
db.execSQL(query);
}
}
0
0
سلام..مسیر sdcard رو به این تغییر بده: SDCARD = context.getExternalFilesDir(null).getAbsolutePath(); (4 سال پیش)
0
0
مسیرش به مسیری که گفتید تغییر دادم
public static final String SDCARD = G.getContext().getExternalFilesDir(null).getAbsolutePath()
اما بازم crash میکند ، میگه :
Attempt to invoke virtual method 'java.io.File android.content.Context.getExternalFilesDir(java.lang.String)' on a null object reference
(4 سال پیش)
0
0
در واقعبرنامم اجرا میشه ولی خب دیتابیس نمیسازه دیگه cath میکنه. (4 سال پیش)
0
0
ببخشید اشتباه پی ام گذاشتم برای دوستمون که پاسخ گذاشتند میخواستم بزارم که پاسخ دادند
(4 سال پیش)
0
0
عزیزان لطفا اگر میدانند لطفا کمک کنند همچنان نتونستم مشکل رفع کنم
(4 سال پیش)
0
0
داخل onCreate که onCreateappdirectory صدا میزنم درست کار میکنه، اما همین که میبرمش داخل request کرش میکنه و میگه Coden't open database (4 سال پیش)
برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال
ChookD1
4 سال پیش
0
0
کلاس G من به شکل زیر هست و داره بصورت کامل تا api های بالا ( من روی 29 هم تست کردم) جواب میده.
public class G extends Application{
public static G app;
public static SQLiteDatabase database;
public final static String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public final static String DIR_APP = DIR_SDCARD + "/Athkar";
public final static String DB_NAME = "db.db";
public static final int DB_VERSION = 1;
@Override
public void onCreate() {
super.onCreate();
app = this;
}
public void createAppDirectories() {
File dbDir = new File(DIR_APP);
try {
if (!dbDir.exists()) {
boolean wasCreated = dbDir.mkdirs();
}
createOrOpenDatabase();
} catch (Exception e) {
Log.i("hdev", "ERROR in copy database");
}
}
public void createOrOpenDatabase() {
if (database != null) {
return;
}
ZekrDatabaseHelper dbHelper = new ZekrDatabaseHelper(this);
database = dbHelper.getReadableDatabase();
}
public static void copydatabase() throws IOException {
InputStream myinput = app.getAssets().open("db.db");
String outfilename = DIR_APP + "/db.db";
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();
}
روشی که گفتید که براتون درست کار میکند را امتحان کردم اما همچنان همان میگه couldnt open database . تابع copydatabase ، را توی Main Activity باید صدا زد ؟؟ یعنی تو اون جایی که میخوایم از دیتابیس استفاده کنیم . بعد اینکه
database = dbHelper.getReadableDatabase();
اینجا بجاش بزنید برای نوشتن هم
database = dbHelper.getWritableDatabase();
کراش نمیکنه برنامتون ؟؟ (4 سال پیش)
پاسخ به سوال
Amirho707
4 سال پیش
0
0
عزیزان
HBase.base.createAppDirectory();
این از runtimePermission ای که هست و درخواست دادم داخلش بیارید بیرون و بعد
requestForWriteSdcardPermission();
در StandardActivity(Main Activity) قرار بدید ، درست کار میکند و دایرکتوری و دیتابیس هاتون ساخته میشه و فکر نمیکنم مشکلی هم بوجود بیاد چون فرد در هرصورت باید اجازه را صادر کنه وگرنه اصن اجازه داده نمیشه که اپلیکیشن اجرا بشه . ممنون
خب میدونید ، شما اومدید و حتما توی اولین برگه ی خودتون ، اطلاعات دیتابیس رو میگیری. تا اون برگه اجرا میشه ، همه چیز خوبه ولی وقتی کاربر میزنه نه ، اجازه نمیده ، برنامه سعی میکنه از دیتابیس بخونه ، درصورتی که هیچ دیتابیسی وجود نداره. شما مثل استاد عمل کنید ، یک صفحه ی اسپلش اسکرین بزارید و توی اون صفحه درصورتی که اجازه داد به صفجه ی بعدی منتقلش بکنید. یا حتی میتونید همون AlertDialog رو قابلیت کنسل کردنشو بردارید. دیگه کاربر بدون اجازه دادن ، نمیتونه وارد برنامه بشه. (4 سال پیش)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .