PDA

View Full Version : کمک فوری - کرش شدن برنامه قبل از گرفتن دسترسی هنگام کپی دیتابیس



hackn82
شنبه 21 بهمن 1396, 12:11 عصر
سلام به همه اساتید گرامی .
من یه برنامه کتاب نوشتم که از دیتابیس خارجی استفاده کردم . و چون از API 26 استفاده کردم باید حتما واسه کپی دیتابیس دسترسی بگیره . الان مشکلم اینجاست که بار اول برنامه به محض اجرا کرش میشه ولی صفحه دسترسی همچنان موجوده و پس از تایید و اجرای برنامه دیگه مشکلی نیست و برنامه به درستی اجرا میشه . کد برنامه رو براتون میفرستم ممنون میشم کمکم کنید .


package farmani.com.essentialwordsforielts.mainPage;

import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import farmani.com.essentialwordsforielts.R;

public class MainActivity extends AppCompatActivity {

public static Context context;
DrawerLayout drawerLayout;
NavigationView navigationView;
ImageView hamburger;
SQLiteDatabase database;
String destPath;

public static ArrayList<Structure> list = new ArrayList<Structure>();
public static ArrayList<Structure> favorite = new ArrayList<Structure>();

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

if(Build.VERSION.SDK_INT >= 23){


if(ContextCompat.checkSelfPermission(MainActivity. this,
Manifest.permission.READ_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions(MainActivity.thi s
, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
,Manifest.permission.WRITE_EXTERNAL_STORAGE}
, 1);

}else if(ContextCompat.checkSelfPermission(MainActivity. this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions(MainActivity.thi s
, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
,Manifest.permission.WRITE_EXTERNAL_STORAGE}
, 1);

}else {

Toast.makeText(MainActivity.this,"You grandet
earlier",Toast.LENGTH_LONG).show();

}


}





try {
destPath =
Environment.getExternalStorageDirectory().getAbsol utePath() + "/ielts/";
File file = new File(destPath);
if (!file.exists()) {
file.mkdirs();
file.createNewFile();
CopyDB(getBaseContext().getAssets().open("md_book.db"),
new FileOutputStream(destPath + "/md_book.db"));
}
} catch (IOException e1) {
e1.printStackTrace();
}

context = getApplicationContext();
setTabOption();

drawerLayout = findViewById(R.id.navigation_drawer);
navigationView = findViewById(R.id.navigation_view);
hamburger = findViewById(R.id.hamburger);
hamburger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
drawerLayout.openDrawer(Gravity.START);
}
});




navigationView.setNavigationItemSelectedListener(n ew
NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.exit) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
MainActivity.this);

alertDialog.setTitle(R.string.exit);

alertDialog.setMessage(R.string.exit_ask);
alertDialog.setCancelable(false);

alertDialog.setPositiveButton(R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int
which) {
finish();
}
});

alertDialog.setNegativeButton(R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int
which) {

dialog.cancel();
}
});

alertDialog.show();
}

return true;
}
});

selectList();
selectFavorite();


}

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

switch (requestCode) {
case 1: {

if (grantResults.length >= 2 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED && grantResults[1] ==
PackageManager.PERMISSION_GRANTED) {

Toast.makeText(MainActivity.this, "Access granted",
Toast.LENGTH_LONG).show();

}

}
}
}


@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(Gravity.START)) {
drawerLayout.closeDrawer(Gravity.START);
} else {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
MainActivity.this);

alertDialog.setTitle(R.string.exit);

alertDialog.setMessage(R.string.exit_ask);
alertDialog.setCancelable(false);

alertDialog.setPositiveButton(R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});

alertDialog.setNegativeButton(R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {

dialog.cancel();
}
});

alertDialog.show();
}
}


private void setTabOption() {
ViewPager viewPager = findViewById(R.id.viewpager);
viewPager.setAdapter(new AdapterFragment(getSupportFragmentManager(),
context));
TabLayout tabStrip = findViewById(R.id.tabs);
tabStrip.setupWithViewPager(viewPager);
}

private void CopyDB(InputStream inputStream, OutputStream outputStream)
throws IOException {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}

private void selectFavorite(){

database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db",
null);
Cursor cursor = database.rawQuery("SELECT * FROM main WHERE fav = 1",
null);
while (cursor.moveToNext()){
String word = cursor.getString(cursor.getColumnIndex("word"));
String definition =
cursor.getString(cursor.getColumnIndex("definition"));
String trans = cursor.getString(cursor.getColumnIndex("trans"));
String img = cursor.getString(cursor.getColumnIndex("img"));
int id = cursor.getInt(cursor.getColumnIndex("id"));

Structure struct = new Structure(word, definition, trans, img, id);
struct.setWord(word);
struct.setDefinition(definition);
struct.setTrans(trans);
struct.setImg(img);
struct.setId(id);
favorite.add(struct);
}

}

private void selectList(){

database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db",
null);
Cursor cursor = database.rawQuery("SELECT * FROM main", null);
while (cursor.moveToNext()){
String word = cursor.getString(cursor.getColumnIndex("word"));
String definition =
cursor.getString(cursor.getColumnIndex("definition"));
String trans = cursor.getString(cursor.getColumnIndex("trans"));
String img = cursor.getString(cursor.getColumnIndex("img"));
int id = cursor.getInt(cursor.getColumnIndex("id"));

Structure struct = new Structure(word, definition, trans, img, id);
struct.setWord(word);
struct.setDefinition(definition);
struct.setTrans(trans);
struct.setImg(img);
struct.setId(id);
list.add(struct);
}

}
}

mz6488
شنبه 21 بهمن 1396, 12:52 عصر
سلام.توی اندروید حتی بعد از دیالوگ ها هم دستورات اجرا میشه.شما اومدید یه درخواست تایید دسترسی برای کاربر نشون دادید و بعد از اون هم کدهای کپی دیتابیس.این قسمت از کد رو باید هم تو else بذارید یعنی اگه sdk بزرگتر از 23 نبود و هم داخل بلاک onRequestPermissionsResult

hackn82
شنبه 21 بهمن 1396, 14:13 عصر
سلام.توی اندروید حتی بعد از دیالوگ ها هم دستورات اجرا میشه.شما اومدید یه درخواست تایید دسترسی برای کاربر نشون دادید و بعد از اون هم کدهای کپی دیتابیس.این قسمت از کد رو باید هم تو else بذارید یعنی اگه sdk بزرگتر از 23 نبود و هم داخل بلاک onRequestPermissionsResult




با تشکر از راهنماییتون میشه لطفا بیشتر توضیح بدید کدوم کد ها رو و کجا بنویسم .

mz6488
شنبه 21 بهمن 1396, 14:27 عصر
با تشکر از راهنماییتون میشه لطفا بیشتر توضیح بدید کدوم کد ها رو و کجا بنویسم .
کدهای پایین باید بره تو onRequestPermissionResult .البته باید بذاریش تو یه متد.چون قراره هم تو این بلاکی که گفتم اجرا بشه و هم تو else اولین شرط


try {
destPath =
Environment.getExternalStorageDirectory().getAbsol utePath() + "/ielts/";
File file = new File(destPath);
if (!file.exists()) {
file.mkdirs();
file.createNewFile();
CopyDB(getBaseContext().getAssets().open("md_book. db"),
new FileOutputStream(destPath + "/md_book.db"));
}
} catch (IOException e1) {
e1.printStackTrace();
}

hackn82
شنبه 21 بهمن 1396, 14:38 عصر
الان اگه درست متوجه شدم باشم باید کد زیر تو اون دو قسمتی که فرمودید بنویسم




try { destPath = Environment.getExternalStorageDirectory().getAbsol utePath() + "/ielts/";
File file = new File(destPath);
if (!file.exists()) {
file.mkdirs();
file.createNewFile();
CopyDB(getBaseContext().getAssets().open("md_book.db"),
new FileOutputStream(destPath + "/md_book.db"));
}
} catch (IOException e1) {
e1.printStackTrace();
}

hackn82
شنبه 21 بهمن 1396, 14:46 عصر
با تشکر از راهنماییتون . مشکل کرش حل شد خدا رو شکر ولی دیتابیس بالا نمیاد

mz6488
شنبه 21 بهمن 1396, 14:55 عصر
خطا میده یا جدول هاش خالیه؟

hackn82
شنبه 21 بهمن 1396, 15:01 عصر
خطا میده یا جدول هاش خالیه؟


خطا نمیده خالیه . انگار دیتابیسی نباشه

mz6488
شنبه 21 بهمن 1396, 15:03 عصر
باید با explorer چک کنید ببینید دیتابیس رو کپی کرده یا نه.خودم با از یه کتابخونه استفاده میکنم که کارهای کپیش رو خودش انجام میده.

hackn82
شنبه 21 بهمن 1396, 15:14 عصر
باید با explorer چک کنید ببینید دیتابیس رو کپی کرده یا نه.خودم با از یه کتابخونه استفاده میکنم که کارهای کپیش رو خودش انجام میده.


الان دوباره اپلیکیشنو پاک کردن و همچنین پوشه دیتابیسو از گوشی . دوباره نصب کردم و همون مشکل قبلی به وجود اومد . بار اول کرش میشه .

کار اپلیکیشنم تموم شده فقط این بخشش مونده که چند روز درگیرم کرده

mz6488
شنبه 21 بهمن 1396, 15:25 عصر
خطای کرش رو دقیقا تو کدوم قسمت میده؟

hackn82
شنبه 21 بهمن 1396, 15:35 عصر
خطای کرش رو دقیقا تو کدوم قسمت میده؟

همون قسمت اول تا اپلیکیشن میادبالا

147630

hackn82
شنبه 21 بهمن 1396, 15:37 عصر
اینم خطای Logcat



02-10 15:58:20.581 17826-17826/farmani.com.essentialwordsforielts E/AndroidRuntime: FATAL EXCEPTION: main Process: farmani.com.essentialwordsforielts, PID: 17826
java.lang.RuntimeException: Unable to start activity ComponentInfo{farmani.com.essentialwordsforielts/farmani.com.essentialwordsforielts.mainPage.MainAc tivity}: android.database.sqlite.SQLiteCantOpenDatabaseExce ption: unknown error (code 14): Could not open database
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2665)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.jav a:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:776)
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseExce ption: unknown error (code 14): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpe n(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLi teConnection.java:209)
at android.database.sqlite.SQLiteConnection.open(SQLi teConnection.java:193)
at android.database.sqlite.SQLiteConnectionPool.openC onnectionLocked(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(S QLiteDatabase.java:808)
at android.database.sqlite.SQLiteDatabase.open(SQLite Database.java:793)
at android.database.sqlite.SQLiteDatabase.openDatabas e(SQLiteDatabase.java:696)
at android.database.sqlite.SQLiteDatabase.openOrCreat eDatabase(SQLiteDatabase.java:711)
at farmani.com.essentialwordsforielts.mainPage.MainAc tivity.selectList(MainActivity.java:283)
at farmani.com.essentialwordsforielts.mainPage.MainAc tivity.onCreate(MainActivity.java:163)
at android.app.Activity.performCreate(Activity.java:6 679)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2618)