Ресурсы $ NotFoundException при извлечении данных из SQLite и отображении в пользовательском представлении списка - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь получить данные, хранящиеся в базе данных, и показать их в пользовательском ListView. Всякий раз, когда я вызываю FenceActivity.class для просмотра данных, приложение падает.

FenceActivity

public class FenceActivity extends AppCompatActivity {
    List<Fence> fenceList;
    SQLiteDatabase sqLiteDatabase;
    ListView listViewFences;
    FenceAdapter fenceAdapter;
    DataBaseHelper dataBaseHelper;

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

        listViewFences = findViewById(R.id.fencesListView);
        fenceList = new ArrayList<>();

        showFencesFromDatabase();
    }

    public void showFencesFromDatabase(){

        dataBaseHelper = new DataBaseHelper(this);
        Cursor cursor = dataBaseHelper.getAllData();

        if(cursor.moveToFirst()){
            do{
                fenceList.add(new Fence(cursor.getInt(0),cursor.getDouble(1),cursor.getDouble(2),cursor.getInt(3)));
            }while (cursor.moveToNext());
        }
        cursor.close();

        fenceAdapter = new FenceAdapter(FenceActivity.this,R.layout.list_layout_fences,fenceList);

        listViewFences.setAdapter(fenceAdapter);
    }

}

Я использую Fence Activity для извлечения данных из класса DatabaseHelper из базы данных.

Адаптер ограждения

public class FenceAdapter extends ArrayAdapter<Fence> {

    Context context;
    int listLayoutRes;
    List<Fence> fenceList;

    public FenceAdapter(Context context, int listLayoutRes, List<Fence> fenceList){
        super(context,listLayoutRes,fenceList);
        this.context = context;
        this.listLayoutRes=listLayoutRes;
        this.fenceList = fenceList;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        View view = layoutInflater.inflate(listLayoutRes,null);

        Fence fence = fenceList.get(position);
        TextView textViewSno = view.findViewById(R.id.textViewSnoLabel);
        TextView textViewLat = view.findViewById(R.id.textViewLatitudeValue);
        TextView textViewLon = view.findViewById(R.id.textViewLongitudeValue);
        TextView textViewRadi = view.findViewById(R.id.textViewRadiusValue);

        textViewSno.setText(fence.getSno());
        textViewLat.setText(String.valueOf(fence.getLat()));
        textViewLon.setText(String.valueOf(fence.getLon()));
        textViewRadi.setText(fence.getRadius());

        Button buttonDel = view.findViewById(R.id.buttonDeleteFence);
        return view;
    }
}

Это мой класс адаптера для раздувания списка.

Забор

public class Fence {

    int radius,sno;
    double lat,lon;

    public Fence( int sno,double lat, double lon,int radius) {
        this.radius = radius;
        this.sno = sno;
        this.lat = lat;
        this.lon = lon;
    }

    public int getRadius() {
        return radius;
    }

    public int getSno() {
        return sno;
    }

    public double getLat() {
        return lat;
    }

    public double getLon() {
        return lon;
    }
}

Функция, к которой я обращаюсь из класса DatabaseHelper

public Cursor getAllData() {
        String query = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);
        return cursor;
    }

Это мой простой класс Fence с геттерами и конструктором.

Трассировка стека

2019-06-29 05:18:19.364 7816-7816/com.abhishakkrmalviya.fencetest E/SchedPolicy: set_timerslack_ns write failed: Operation not permitted
2019-06-29 05:18:19.448 7816-7816/com.abhishakkrmalviya.fencetest E/lviya.fencetes: Invalid ID 0x00000001.
2019-06-29 05:18:19.450 7816-7816/com.abhishakkrmalviya.fencetest E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.abhishakkrmalviya.fencetest, PID: 7816
    android.content.res.Resources$NotFoundException: String resource ID #0x1
        at android.content.res.Resources.getText(Resources.java:360)
        at android.content.res.MiuiResources.getText(MiuiResources.java:97)
        at android.widget.TextView.setText(TextView.java:5837)
        at com.abhishakkrmalviya.fencetest.FenceAdapter.getView(FenceAdapter.java:39)
        at android.widget.AbsListView.obtainView(AbsListView.java:2399)
        at android.widget.ListView.makeAndAddView(ListView.java:2126)
        at android.widget.ListView.fillDown(ListView.java:851)
        at android.widget.ListView.fillDown(ListView.java:833)
        at android.widget.ListView.fillFromTop(ListView.java:921)
        at android.widget.ListView.layoutChildren(ListView.java:1900)
        at android.widget.AbsListView.onLayout(AbsListView.java:2198)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:774)
        at android.view.View.layout(View.java:20726)
        at android.view.ViewGroup.layout(ViewGroup.java:6198)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2856)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2383)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1523)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7395)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1065)
        at android.view.Choreographer.doCallbacks(Choreographer.java:877)
        at android.view.Choreographer.doFrame(Choreographer.java:808)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1051)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6806)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

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

1 Ответ

1 голос
/ 29 июня 2019

Похоже, он не может найти ресурс по идентификатору, который вы ему передали. Это должен быть идентификатор макета вашего элемента списка. Вместо того, чтобы передавать этот идентификатор в конструкторе вашего fenceAdaptor, вы должны просто использовать код, подобный этому, в методе getView адаптера:

    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.list_layout_fences, null);
    }

Я вижу, что вы также надуваете свое собственное локальное представление, но вы должны надувать convertView, который был передан в метод getView.

...