API 26首次运行时数据库未加载。

3
我创建了一个带有数据库的应用程序,该数据库位于资产文件夹中。我编写了一段代码来将数据库复制到SD卡上,并且当然需要在Android 6+上运行时权限。我的问题是:在授予权限后第一次运行时,数据库不会加载,但第二次运行没有问题。请帮助我解决这个问题。
更新:问题已经解决!现在我的问题在于“最爱”部分。当我添加某些内容到最爱时,它无法更新,并且我必须重新启动应用程序,而且每次运行时数据都会显示多次。
以下是我的代码:
package farmani.com.essentialwordsforielts.mainPage;


import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
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;
import farmani.com.essentialwordsforielts.search.ActivitySearch;

public class MainActivity extends AppCompatActivity {

public static Context context;
public static ArrayList<Structure> list = new ArrayList<>();
public static ArrayList<Structure> favorite = new ArrayList<>();
DrawerLayout drawerLayout;
NavigationView navigationView;
ImageView hamburger;
SQLiteDatabase database;
String destPath;

@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.this
                    , 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.this
                    , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
                            , Manifest.permission.WRITE_EXTERNAL_STORAGE}
                    , 1);

        } else {

            setupDB();
            selectList();
            selectFavorite();



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

        }


    }

    if (!favorite.isEmpty()){
        favorite.clear();
        selectFavorite();
    } else if (!list.isEmpty()){
        list.clear();
        selectList();
    }

    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(new 
   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();
            }

            if (id == R.id.search) {
                Intent intent = new Intent(MainActivity.this, 
    ActivitySearch.class);
                MainActivity.this.startActivity(intent);
            }

            return true;
        }
    });


    }

   @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 setupDB() {
    try {
        destPath =
                Environment.getExternalStorageDirectory().getAbsolutePath() 
    + "/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();
    }
}

    @Override
    protected void onResume() {
    super.onResume();
    if (!favorite.isEmpty()){
        favorite.clear();
        selectFavorite();
    } else if (!list.isEmpty()){
        list.clear();
        selectList();
    }
}

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);
    }

}

}

这是很多源代码,但是你能否在用户授权时设置断点/日志条目。确保在用户授权后调用创建数据库的方法。 - dazza5000
日志后没有结果 - Sam Atkinson
1个回答

0

在第一次授权后,即在onRequestPermissionsResult内部,您刚刚显示了一个toast。 您还需要将执行必要操作的代码放置在其中。


我执行了setupDB(); selectList(); selectFavorite(); 但没有任何效果。 - Sam Atkinson
如果需要的话,请尝试使用这个库。https://github.com/nabinbhandari/Android-Permissions - Nabin Bhandari
非常感谢,问题已解决。现在我又遇到了另一个问题,数据在列表中显示了多次。 - Sam Atkinson
当然。非常感谢。 - Sam Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接