آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

error for database(Can not open Database)

Amirho707  4 سال پیش  4 سال پیش
0 0

با سلام کسی میتواند کمکم کند چطوری این ارور برطرف کنم ؟؟ ممنون

اینم منیفست :
<?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();

}
0 0
البته متد آپگرید و اینا رو بهش اضاف کنید. (4 سال پیش)
0 0
روشی که گفتید که براتون درست کار میکند را امتحان کردم اما همچنان همان میگه couldnt open database . تابع copydatabase ، را توی Main Activity باید صدا زد ؟؟ یعنی تو اون جایی که میخوایم از دیتابیس استفاده کنیم . بعد اینکه database = dbHelper.getReadableDatabase(); اینجا بجاش بزنید برای نوشتن هم database = dbHelper.getWritableDatabase(); کراش نمیکنه برنامتون ؟؟ (4 سال پیش)
0 0
بله با یک ترای/کچ در اکتیویتی اصلی صدا زده میشه. (4 سال پیش)
0 0
اجرا نمیشه :( (4 سال پیش)
پاسخ به سوال 
Amirho707  4 سال پیش
0 0

عزیزان

HBase.base.createAppDirectory();

این از runtimePermission ای که هست و درخواست دادم داخلش بیارید بیرون و بعد 

requestForWriteSdcardPermission();

در StandardActivity(Main Activity) قرار بدید ، درست کار میکند و دایرکتوری و دیتابیس هاتون ساخته میشه و فکر نمیکنم مشکلی هم بوجود بیاد چون فرد در هرصورت باید اجازه را صادر کنه وگرنه اصن اجازه داده نمیشه که اپلیکیشن اجرا بشه . ممنون

0 0
اما باز مشکل حل نمیشه فرد که denied کنه و مجوز نده اپلیکیشن کرش میکنه . (4 سال پیش)
+2 0
خب میدونید ، شما اومدید و حتما توی اولین برگه ی خودتون ، اطلاعات دیتابیس رو میگیری. تا اون برگه اجرا میشه ، همه چیز خوبه ولی وقتی کاربر میزنه نه ، اجازه نمیده ، برنامه سعی میکنه از دیتابیس بخونه ، درصورتی که هیچ دیتابیسی وجود نداره. شما مثل استاد عمل کنید ، یک صفحه ی اسپلش اسکرین بزارید و توی اون صفحه درصورتی که اجازه داد به صفجه ی بعدی منتقلش بکنید. یا حتی میتونید همون AlertDialog رو قابلیت کنسل کردنشو بردارید. دیگه کاربر بدون اجازه دادن ، نمیتونه وارد برنامه بشه. (4 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .