ListView ArrayAdapter не получил никаких данных из SQLite - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть приложение, которое показывает данные в ListView из базы данных SQLite

я не получил никаких исключений и т. Д., Но мои данные не отображаются

вот мой код активности

    package id.habatus.amsw;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class SyncCollectActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    private CollectDataHelper dbHelper;
    private ListView list;
    private List<SyncCollect> syncs;
    Cursor cursor;

    public static final int NAME_SYNCED_WITH_SERVER = 1;
    public static final int NAME_NOT_SYNCED_WITH_SERVER = 0;
    public static final String DATA_SAVED_BROADCAST = "id.habatus.datasaved";
    private BroadcastReceiver broadcastReceiver;
    private SyncCollectAdapter adapter;
    Button col, drop;
    ImageButton back;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sync_collect);
        dbHelper = new CollectDataHelper(this);
        syncs = new ArrayList<>();

        list = findViewById(R.id.listViewNames);
        list.setOnItemClickListener(this);

        drop = findViewById(R.id.btncanvas);
        back = findViewById(R.id.kembali);
        loadData();
        refresh();
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                //loading the names again
                loadData();
                refresh();
            }
        };
        registerReceiver(broadcastReceiver, new IntentFilter(DATA_SAVED_BROADCAST));


        drop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(SyncCollectActivity.this,SyncActivity.class);
                startActivity(i);
            }
        });
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(SyncCollectActivity.this,DecisionActivity.class);
            }
        });


    }

    private void loadData() {
        syncs.clear();
        Cursor cursor = dbHelper.getData();
        if (cursor.moveToFirst()){
            while (cursor.moveToNext()){
                SyncCollect sync = new SyncCollect(
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.id_p)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.nama)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.alamat)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.saldo)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.pinjaman)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.angsuran)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.keterangan)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.latitude)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.longitude)),
                        cursor.getString(cursor.getColumnIndex(CollectDataHelper.status)),
                        cursor.getInt(cursor.getColumnIndex(CollectDataHelper.syncstatus))

                );
                syncs.add(sync);
            }
        }
        adapter = new SyncCollectAdapter(this,R.layout.sync_item,syncs);
        list.setAdapter(adapter);
    }

    public void refresh(){
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(broadcastReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
    }

    @Override
    public void onPause() {
        unregisterReceiver(broadcastReceiver);
        super.onPause();
    }


    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

    }
}

в этом упражнении я хочу показать все данные из моей базы данных SQLite, я подозреваю, что в методе loadData что-то не так, но, возможно, это не так.это мой класс CollectDataHelper

    package id.habatus.amsw;

/**
 * Created by SMK TELKOM on 9/6/2018.
 */

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;
import java.util.HashMap;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;
import java.util.HashMap;


    public class CollectDataHelper extends SQLiteOpenHelper {
    public static final String KEY_ROWID ="_id";
    public static  final String id_p = "id_p";
    public static  final String nama = "nama";
    public static  final String alamat = "alamat";
    public static  final String saldo = "saldo";
    public static  final String pinjaman = "pinjaman";
    public static  final String angsuran = "angsuran";
    public static  final String keterangan = "keterangan";
    public static  final String latitude = "latitude";
    public static  final String longitude = "longitude";
    public static  final String syncstatus = "syncstatus";
    public static final String status = "status";
    public static  final String table = "collect";
    String TAG = "C_DL Activity";

    public static  final String broadcast = "id.habatus.amsw.broadcast";
    public static final  int SYNC_STATUS_OK = 1;
    public static final  int SYNC_STATUS_FAILED = 0;
    private static final String DATABASE_NAME = "col";
    private static final int DATABASE_VERSION = 1;
    private static final String  DROP_TABLE ="DROP TABLE IF EXISTS collect";
    public CollectDataHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql = "create table collect(id_p integer primary key, nama text null, alamat text null, saldo text null, pinjaman text null, angsuran text null, keterangan text null, latitude text null, longitude text null,status text null, syncstatus integer);";
        Log.d("Data", "onCreate: " + sql);
        db.execSQL(sql);
        sql = "INSERT INTO collect (`id_p`, `nama`, `alamat`, `saldo`, `pinjaman`, `angsuran`, `keterangan`, `latitude`, `longitude`, `status`, `syncstatus`) VALUES\n" +
                "(909095, 'AM Nata Waskita', 'Kediri', '0', '500000', '65000', 'segera', '-7.2583968', '112.7109815','NOTCOLL', '0');";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        db.execSQL(DROP_TABLE);
        onCreate(db);
    }

    public Cursor getList(){
        SQLiteDatabase db = getReadableDatabase();
        String query = "SELECT rowid as " +KEY_ROWID+ "," +id_p+ "," +nama+ "," +alamat+ "," +saldo+ "," +pinjaman+ "," +angsuran+
                "," +keterangan+ " FROM " + table;

        Cursor cursor= db.rawQuery(query,null);
        if (cursor == null){
            return null;
        } else if (!cursor.moveToFirst()){
            cursor.close();
            return null;
        }
        return  cursor;
    }
    public Cursor getListByKeyword(String search){
        SQLiteDatabase db = getReadableDatabase();
        String query = "SELECT rowid as "+KEY_ROWID+ "," +id_p+","+nama+ ","+alamat+","+saldo+","+pinjaman+","+angsuran+
                ","+keterangan+" FROM " + table + " WHERE " + nama + "  LIKE  '%" +search+ "%' " ;

        Cursor cursor = db.rawQuery(query,null );

        if(cursor == null){
            return null;
        }else if (!cursor.moveToFirst()){
            cursor.close();
            return null;
        }
        return cursor;
    }

    public ArrayList<HashMap<String, String>> getAllData() {
        ArrayList<HashMap<String, String>> wordList;
        wordList = new ArrayList<HashMap<String, String>>();
        String selectQuery = "SELECT * FROM " + table;
        SQLiteDatabase database = this.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put(id_p, cursor.getString(0));
                map.put(nama, cursor.getString(1));
                map.put(alamat, cursor.getString(2));
                map.put(saldo, cursor.getString(3));
                map.put(pinjaman, cursor.getString(4));
                map.put(angsuran, cursor.getString(5));
                map.put(keterangan, cursor.getString(6));
                map.put(latitude, cursor.getString(7));
                map.put(longitude, cursor.getString(8));
                map.put(status, cursor.getString(9));
                wordList.add(map);
            } while (cursor.moveToNext());
        }

        Log.e("select sqlite ", "" + wordList);

        database.close();
        return wordList;
    }

    public boolean edit(String id_p, String nama, String alamat, String saldo, String pinjaman, String angsuran, String keterangan,String latitude,
                        String longitude, String status,int syncstatus){
        try{
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(CollectDataHelper.nama,nama);
            cv.put(CollectDataHelper.alamat,alamat);
            cv.put(CollectDataHelper.saldo,saldo);
            cv.put(CollectDataHelper.pinjaman,pinjaman);
            cv.put(CollectDataHelper.angsuran,angsuran);
            cv.put(CollectDataHelper.keterangan,keterangan);
            cv.put(CollectDataHelper.latitude,latitude);
            cv.put(CollectDataHelper.longitude,longitude);
            cv.put(CollectDataHelper.status,status);
            cv.put(CollectDataHelper.syncstatus, syncstatus);
            int result = db.update(table,cv, CollectDataHelper.id_p + " =?",new String[]{id_p});
            if (result > 0){
                return true;
            }

        }catch (SQLException e){
            e.printStackTrace();
        }
        return false;
    }
    public  boolean updatelocal(String id_p , int syncstatus){
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(DataHelper.syncstatus,syncstatus);

        database.update(DataHelper.table,contentValues, CollectDataHelper.id_p + "=" + id_p,null);
        return true;
    }
    public Cursor getUnsynced(){
        SQLiteDatabase db = this.getReadableDatabase();
        String sql = "SELECT * FROM " + table + " WHERE "+ syncstatus + " = 0";
        Cursor c = db.rawQuery(sql,null);
        return c;
    }
    public Cursor getData() {
        SQLiteDatabase db = this.getReadableDatabase();
        String sql = "SELECT * FROM " + table + " ORDER BY " + id_p + " ASC;";
        Cursor c = db.rawQuery(sql, null);
        return c;
    }


}

в методе getData. Я хочу выбрать все мои данные из таблицы сбора и упорядочить их по идентификатору. Я попытался выполнить запрос к исполнителю запросов SQLite на веб-сайте, и он работает правильно..

это мой класс адаптера

    package id.habatus.amsw;

import android.content.Context;
import android.media.Image;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by SMK TELKOM on 9/20/2018.
 */

public class SyncCollectAdapter extends ArrayAdapter<SyncCollect> {
    private List<SyncCollect> SyncCollects;
    private Context context;

    public SyncCollectAdapter(Context context, int resource,List<SyncCollect> SyncCollects) {
        super(context, resource, SyncCollects);
        this.context = context;
        this.SyncCollects = SyncCollects;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //getting the layoutinflater
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //getting listview itmes
        View listViewItem = inflater.inflate(R.layout.sync_item2, null, true);
        TextView txid = listViewItem.findViewById(R.id.txid_p);
        TextView txnama = listViewItem.findViewById(R.id.txname);
        TextView txalamat = listViewItem.findViewById(R.id.txalamat);
        TextView txsaldo = listViewItem.findViewById(R.id.txsaldo);
        TextView txpinjaman = listViewItem.findViewById(R.id.txpinjaman);
        TextView txangsuran = listViewItem.findViewById(R.id.txangsuran);
        TextView txketerangan = listViewItem.findViewById(R.id.txketerangan);
        TextView txlatitude = listViewItem.findViewById(R.id.txlatitude);
        TextView txlongitude = listViewItem.findViewById(R.id.txlongitude);
        TextView txstatus = listViewItem.findViewById(R.id.txstatus);
        ImageView status = listViewItem.findViewById(R.id.imsync);

        //getting the current name
        SyncCollect name = SyncCollects.get(position);

        //setting the name to textview
        txid.setText(name.getId_p());
        txnama.setText(name.getNama());
        txalamat.setText(name.getAlamat());
        txsaldo.setText(name.getSaldo());
        txpinjaman.setText(name.getPinjaman());
        txangsuran.setText(name.getAngsuran());
        txketerangan.setText(name.getKeterangan());
        txlatitude.setText(name.getLatitude());
        txlongitude.setText(name.getLongitude());
        txstatus.setText(name.getStatus());


        //if the SyncCollected status is 0 displaying
        //queued icon
        //else displaying SyncCollected icon
        if (name.getSyncstatus() == 0)
            status.setBackgroundResource(R.drawable.refresh);
        else
            status.setBackgroundResource(R.drawable.checked);

        return listViewItem;
    }
}

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

и это мой класс SyncCollect

    public class SyncCollect {

    public String nama;
    public String id_p;
    public int syncstatus;
    public String saldo;
    public String alamat;
    public String pinjaman;
    public String angsuran;
    public String keterangan;
    public String latitude;
    public String longitude;
    public String status;



    public SyncCollect(String id_p, String nama, String alamat, String pinjaman, String angsuran, String keterangan, String saldo, String latitude, String longitude,String status, int syncstatus) {
        this.id_p = id_p;
        this.nama = nama;
        this.alamat = alamat;
        this.saldo = saldo;
        this.pinjaman = pinjaman;
        this.angsuran = angsuran;
        this.keterangan = keterangan;
        this.latitude=latitude;
        this.longitude=longitude;
        this.status = status;
        this.syncstatus=syncstatus;

    }
    public int getSyncstatus() {
        return syncstatus;
    }

    public void setSyncstatus(int syncstatus) {
        this.syncstatus = syncstatus;
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public String getId_p() {
        return id_p;
    }

    public void setId_p(String id_p) {
        this.id_p = id_p;
    }

    public String getSaldo() {
        return saldo;
    }

    public void setSaldo(String saldo) {
        this.saldo = saldo;
    }

    public String getAlamat() {
        return alamat;
    }

    public void setAlamat(String alamat) {
        this.alamat = alamat;
    }

    public String getPinjaman() {
        return pinjaman;
    }

    public void setPinjaman(String pinjaman) {
        this.pinjaman = pinjaman;
    }

    public String getAngsuran() {
        return angsuran;
    }

    public void setAngsuran(String angsuran) {
        this.angsuran = angsuran;
    }

    public String getKeterangan() {
        return keterangan;
    }

    public void setKeterangan(String keterangan) {
        this.keterangan = keterangan;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getStatus() {
        return status;
    }

    public void  setStatus(String status){
        this.status = status;
    }
}

я думаю, что здесь тоже нет ничего плохого, потому что его параметр совпадает с моими столбцами в базе данных.

у меня естьИщите все, что связано с этим, но нет решения этой проблемы, я надеюсь, что кто-нибудь может мне помочь.

Большое спасибо

1 Ответ

0 голосов
/ 22 сентября 2018

Ваша проблема может быть связана с тем, что таблица содержит только одну строку (в соответствии со вставкой в ​​методе onCreate класса CollectDataHelper).

То есть предполагается, что строка вставлена, а других строк нетзатем вставляются.

movetoFirst переместится в первую (единственную) строку, за которой следует moveToNext , который следует после последней строки (или в2-я строка, если несколько строк, поэтому пропускается первая строка), поэтому возвращается значение false, а цикл while не вводится.Поэтому нет данных для отображения, также нет ошибки.

Возможно, решение заключается в использовании: -

private void loadData() {
    syncs.clear();
    Cursor cursor = dbHelper.getData();
    while (cursor.moveToNext()){
        SyncCollect sync = new SyncCollect(
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.id_p)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.nama)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.alamat)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.saldo)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.pinjaman)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.angsuran)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.keterangan)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.latitude)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.longitude)),
            cursor.getString(cursor.getColumnIndex(CollectDataHelper.status)),
            cursor.getInt(cursor.getColumnIndex(CollectDataHelper.syncstatus))
        );
        syncs.add(sync);
    }
  • Даже если таблица содержит больше строк, первая строка будет пропущенабез вышеуказанного изменения.
...