Android Studio: не грузит БД SQLite

291
08 ноября 2017, 00:06

Должные грузиться данные из подключенной БД. Вместо этого приложение при нажатии на нужный фрагмент вылетает с ошибкой. Не могу понять, в чем может быть причина?

Код лога:

FATAL EXCEPTION: main Process: com.example.gukov.guap, PID: 3109 android.content.res.Resources$NotFoundException: String resource ID 0x19 at android.content.res.Resources.getText(Resources.java:274) at android.widget.TextView.setText(TextView.java:4122) at com.example.gukov.guap.DirectionAdapter.onBindViewHolder(DirectionAdapter.java:45) at com.example.gukov.guap.DirectionAdapter.onBindViewHolder(DirectionAdapter.java:17) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515) at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3109) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.view.View.measure(View.java:17430) at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934) at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) at android.view.View.measure(View.java:17430) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.d

Код DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {
    private static String DB_NAME = "meetpeople.db";
    private static String DB_PATH = "";
    private SQLiteDatabase myDatabase;
    private final Context myContext;
    private static final int DB_VERSION = 1;
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        if (Build.VERSION.SDK_INT>=15) {
            DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
        }
        else {
            DB_PATH = Environment.getDataDirectory() + context.getPackageName() + "/databases/";
        }
        this.myContext = context;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
    public void checkAndCopyDatabase() {
        boolean dbExist = checkDatebase();
        if (dbExist) {
            Log.d("TAG", "database already exist");
        } else {
            this.getReadableDatabase();
        }
        try {
            copyDatabase();;
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("TAG", "Error copy database");
        }
    }
    public boolean checkDatebase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        } catch (SQLException e) {
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }
    public void copyDatabase() throws IOException {
        InputStream myInput = myContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int lenght;
        while ((lenght = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, lenght);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }
    public void openDatabase() {
        String myPath = DB_PATH + DB_NAME;
        myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }
    public synchronized void close() {
        if (myDatabase != null) {
            myDatabase.close();
        }
        super.close();
    }
    public Cursor QueryData(String query) {
        return myDatabase.rawQuery(query, null);
    }
}

Код фрагмента SearchFragment

public class SearchFragment extends Fragment {
    RecyclerView recyclerView;
    DirectionAdapter adapter;
    DatabaseHelper databaseHelper;
    Cursor cursor;
    List<Direction> directionList;
    public SearchFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_search, container, false);
        FloatingActionButton buttonAdd = (FloatingActionButton) rootView.findViewById(R.id.floatingActionButton);
        buttonAdd.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(getActivity().getApplication().getApplicationContext(), AddMeetActivity.class);
                startActivity(intent);
            }
        });

        directionList = new ArrayList<>();
        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplication().getApplicationContext()));


        databaseHelper= new DatabaseHelper(getActivity().getApplication().getApplicationContext());
        try {
            databaseHelper.checkAndCopyDatabase();
            databaseHelper.openDatabase();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            cursor = databaseHelper.QueryData("select * from directions");
            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    do {
                        directionList.add(
                                new Direction(
                                        cursor.getInt(0),
                                        cursor.getInt(2),
                                        cursor.getString(1),
                                        cursor.getInt(3)));
                    } while (cursor.moveToNext());
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        DirectionAdapter adapter = new DirectionAdapter(getActivity().getApplication().getApplicationContext(), directionList);
        recyclerView.setAdapter(adapter);
        return rootView;
    }}`

Код адаптера DirectionAdapter

`public class DirectionAdapter extends RecyclerView.Adapter<DirectionAdapter.DirectionViewHolder> {
    private Context mCtx;
    private List<Direction> directionList;
    public DirectionAdapter(Context mCtx, List<Direction> directionList) {
        this.mCtx = mCtx;
        this.directionList = directionList;
    }
    @Override
    public DirectionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mCtx);
        View view = inflater.inflate(R.layout.direction, null);
        return new DirectionViewHolder(view);
    }
    @Override
    public void onBindViewHolder(DirectionViewHolder holder, int position) {
        Direction direction = directionList.get(position);
        String colorName = "colorDirection_" + direction.getDirectionColor();
        int colorId = mCtx.getResources().getIdentifier(colorName, "color", mCtx.getPackageName());
        holder.relativeLayoutDirection.setBackgroundResource(colorId);
        holder.textViewDirectionTitle.setText(direction.getDirectionTitle());
        holder.textViewDirectionCount.setText(direction.getDirectionCount());
    }
    @Override
    public int getItemCount() {
        return directionList.size();
    }
    class DirectionViewHolder extends RecyclerView.ViewHolder {
        TextView textViewDirectionTitle, textViewDirectionCount;
        RelativeLayout relativeLayoutDirection;
        public DirectionViewHolder(View itemView) {
            super(itemView);

            textViewDirectionTitle = itemView.findViewById(R.id.textViewDirectionTitle);
            textViewDirectionCount = itemView.findViewById(R.id.textViewDirectionCount);
            relativeLayoutDirection = itemView.findViewById(R.id.relativeLayoutDirection);
        }
    }
}
Answer 1

Ошибка в том, что вы помещаете в свой список значения типа int. Метод setText() при выводе на экран воспринимает это, как идинтификатор ресурса (а не число, которое надо отобразить на экране, такая перегрузка у метода при единственном аргументе типа int). Соответственно строкового ресурса с таким ID в вашем проекте не нашлось, о чем вам и сообщается в стектрейсе.

Приведите значения типа int к типу String (Integer.toString(int value)), чтобы они отображались как текст.

PS: хотелось бы, чтобы вы очень внимательно прочитали первые абзацы из этого ответа и поняли, что работать в адаптере надо непосредственно с курсором, полученным от БД, а не перегонять данные в динамические списки во избежании боли - ничего, кроме дополнительного расхода ресурсов устройства и потерь времени вы с такой реализацией не "выгадаете".

У контекста есть специальный метод для получения пути к БД, включая ее имя (не надо добавлять отдельно), который работает корректно на всех версиях API:

DB_PATH = context.getDatabasePath(DATABASE_NAME).toString();

подробнее смотрите реализацию класса SQLiteOpenHelper с копированием готовой БД в этом ответе

READ ALSO
Подключение WebGL

Подключение WebGL

Привет, мне нужно подключить WebGL к браузеру, в лаунчере игры, а я понятия не имею как это сделать

287
Проблема в инициализации branch.io

Проблема в инициализации branch.io

Использую библиотеку branchio для работы с app link

237
Java: заштриховать Hintergrund

Java: заштриховать Hintergrund

Имеется прямоугольник как графический элементВ нем содержится текст, если нарисовать при помощи drawLine самостоятельно линии-штриховки, то эти...

194
Перевести кусок кода из java в c++

Перевести кусок кода из java в c++

Нужно перевести кусочек кода на С++:

256