Должные грузиться данные из подключенной БД. Вместо этого приложение при нажатии на нужный фрагмент вылетает с ошибкой. Не могу понять, в чем может быть причина?
Код лога:
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);
}
}
}
Ошибка в том, что вы помещаете в свой список значения типа int
. Метод setText()
при выводе на экран воспринимает это, как идинтификатор ресурса (а не число, которое надо отобразить на экране, такая перегрузка у метода при единственном аргументе типа int
). Соответственно строкового ресурса с таким ID в вашем проекте не нашлось, о чем вам и сообщается в стектрейсе.
Приведите значения типа int
к типу String
(Integer.toString(int value)
), чтобы они отображались как текст.
PS: хотелось бы, чтобы вы очень внимательно прочитали первые абзацы из этого ответа и поняли, что работать в адаптере надо непосредственно с курсором, полученным от БД, а не перегонять данные в динамические списки во избежании боли - ничего, кроме дополнительного расхода ресурсов устройства и потерь времени вы с такой реализацией не "выгадаете".
У контекста есть специальный метод для получения пути к БД, включая ее имя (не надо добавлять отдельно), который работает корректно на всех версиях API:
DB_PATH = context.getDatabasePath(DATABASE_NAME).toString();
подробнее смотрите реализацию класса SQLiteOpenHelper
с копированием готовой БД в этом ответе
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Привет, мне нужно подключить WebGL к браузеру, в лаунчере игры, а я понятия не имею как это сделать
Имеется прямоугольник как графический элементВ нем содержится текст, если нарисовать при помощи drawLine самостоятельно линии-штриховки, то эти...