将SQLite数据导出到CSV仅输出CSV文件中数据库的最后一个条目

时间:2019-09-07 12:15:24

标签: java android android-sqlite export-to-csv

我正在尝试为我的大学制作出勤应用程序。我已经使用SQLite进行数据存储(学生名单,出勤数据等),我希望将出勤数据导出为CSV文件。问题是,当我导出文件时,仅将SQLite Db的最后一个条目写入CSV。我已附上以下代码,以更好地理解。

public void exportExcelSheet() {

        DatabaseHandler mDbHandler = new DatabaseHandler(mActivity);
        File exportDir = new File(Environment.getExternalStorageDirectory(), "");
        if (!exportDir.exists())
        {
            exportDir.mkdirs();
        }

        File file = new File(exportDir, "Report.csv");

        String[] ColumnNames = {"Roll No.","Name","LA","LT","% age"};

        String studentInfoQuery = "SELECT * FROM StudentList";
        Cursor studentsListCursor = mDbHandler.execQuery(studentInfoQuery);

        studentsListCursor.moveToFirst();

        while(!studentsListCursor.isAfterLast()) {


            String AttendanceListQuery = "SELECT * FROM AttendanceSheet WHERE StudRoll = '" + studentsListCursor.getPosition() + "';";
            String AttendanceQuery = "SELECT * FROM AttendanceSheet WHERE StudRoll = '" + studentsListCursor.getPosition() + "' AND isPresent = 1";


            int attendancePercent = 0;
            Cursor totalClasses = mDbHandler.execQuery(AttendanceListQuery);
            Cursor attendedClasses = mDbHandler.execQuery(AttendanceQuery);

            if (totalClasses == null) {
                Log.d("profile", "totalClasses null");
            }

            if (attendedClasses == null) {
                Log.d("profile", "attendedClasses null");
            }

            if (totalClasses != null && attendedClasses != null) {
                totalClasses.moveToFirst();
                attendedClasses.moveToFirst();

                try {
                    attendancePercent = (int) (((float) attendedClasses.getCount() / totalClasses.getCount()) * 100);
                } catch (Exception e) {
                    attendancePercent = -1;
                }
            }

            assert attendedClasses != null;
            assert totalClasses != null;
            String showAttendedLectures = String.valueOf(attendedClasses.getCount());
            String showTotalLectures = String.valueOf(totalClasses.getCount());
            //String showMissedLectures = String.valueOf(totalClasses.getCount() - attendedClasses.getCount());
            String AttendancePercentage = String.valueOf(attendancePercent);

            try
            {
                if(!file.exists()){
                    file.createNewFile();

                }

                CSVWriter csvWrite = new CSVWriter(new FileWriter(file));

                csvWrite.writeNext(ColumnNames);
                    String[] arrStr ={studentsListCursor.getString(1),studentsListCursor.getString(0), showAttendedLectures, showTotalLectures, AttendancePercentage + " %"};
                    csvWrite.writeNext(arrStr);
                studentsListCursor.moveToNext();
                csvWrite.close();
            }
            catch(Exception sqlException)
            {
                Toast.makeText(mActivity, "FAILED", Toast.LENGTH_SHORT).show();
                Log.e("MainActivity", sqlException.getMessage(), sqlException);
            }

            Toast.makeText(mActivity, "Saved", Toast.LENGTH_SHORT).show();
        }
    }
}

Here's What the CSV File looks like.

2 个答案:

答案 0 :(得分:0)

此代码中只有一个小错误,就是每当执行do-while循环时都会创建csvWriter对象,因此最后一个输出CSV文件仅从游标中提取了单行和最后一行。 这应该可以解决问题:

public void exportExcelSheet() {
    DatabaseHandler mDbHandler = new DatabaseHandler(mActivity);
    File exportDir = new File(Environment.getExternalStorageDirectory(), "");
    if (!exportDir.exists()) {
        exportDir.mkdirs();
    }

    File file = new File(exportDir, "Report.csv");

    // ============== CHANGE ==============
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    String[] ColumnNames = {"Roll No.", "Name", "LA", "LT", "% age"};

    // ============== CHANGE ==============
    CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
    csvWrite.writeNext(ColumnNames);

    String studentInfoQuery = "SELECT * FROM StudentList";
    Cursor studentsListCursor = mDbHandler.execQuery(studentInfoQuery);

    studentsListCursor.moveToFirst();

    // ============== CHANGE ==============
    do {
        String AttendanceListQuery = "SELECT * FROM AttendanceSheet WHERE StudRoll = '" + studentsListCursor.getPosition() + "';";
        String AttendanceQuery = "SELECT * FROM AttendanceSheet WHERE StudRoll = '" + studentsListCursor.getPosition() + "' AND isPresent = 1";


        int attendancePercent = 0;
        Cursor totalClasses = mDbHandler.execQuery(AttendanceListQuery);
        Cursor attendedClasses = mDbHandler.execQuery(AttendanceQuery);

        if (totalClasses == null) {
            Log.d("profile", "totalClasses null");
        }

        if (attendedClasses == null) {
            Log.d("profile", "attendedClasses null");
        }

        if (totalClasses != null && attendedClasses != null) {
            totalClasses.moveToFirst();
            attendedClasses.moveToFirst();

            try {
                attendancePercent = (int) (((float) attendedClasses.getCount() / totalClasses.getCount()) * 100);
            } catch (Exception e) {
                attendancePercent = -1;
            }
        }

        assert attendedClasses != null;
        assert totalClasses != null;
        String showAttendedLectures = String.valueOf(attendedClasses.getCount());
        String showTotalLectures = String.valueOf(totalClasses.getCount());
        //String showMissedLectures = String.valueOf(totalClasses.getCount() - attendedClasses.getCount());
        String AttendancePercentage = String.valueOf(attendancePercent);

        try {
            String[] arrStr = {studentsListCursor.getString(1), studentsListCursor.getString(0), showAttendedLectures, showTotalLectures, AttendancePercentage + " %"};
            csvWrite.writeNext(arrStr);
            // ============== CHANGE ==============
            // studentsListCursor.moveToNext();
        } catch (Exception sqlException) {
            Toast.makeText(mActivity, "FAILED", Toast.LENGTH_SHORT).show();
            Log.e("MainActivity", sqlException.getMessage(), sqlException);
        }

        Toast.makeText(mActivity, "Saved", Toast.LENGTH_SHORT).show();
    }
    // ============== CHANGE ==============
    while (studentsListCursor.moveToNext());

    csvWrite.close();
}

答案 1 :(得分:0)

对于其他希望回答类似问题的人,根据Dheeraj的《守则》和其他较小的更改,最终的工作守则将为-

 public void exportExcelSheet() throws IOException {
    DatabaseHandler mDbHandler = new DatabaseHandler(mActivity);
    File exportDir = new File(Environment.getExternalStorageDirectory(), "");
    if (!exportDir.exists()) {
        exportDir.mkdirs();
    }

    File file = new File(exportDir, "Report.csv");

    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    String[] ColumnNames = {"Roll No.", "Name", "LA", "LT", "% age"};

    CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
    csvWrite.writeNext(ColumnNames);

    String studentInfoQuery = "SELECT * FROM StudentList";
    Cursor studentsListCursor = mDbHandler.execQuery(studentInfoQuery);

    studentsListCursor.moveToFirst();

    do {
        int studentRoll = studentsListCursor.getPosition() + 1;
        String AttendanceListQuery = "SELECT * FROM AttendanceSheet WHERE StudRoll = '" + studentRoll + "';";
        String AttendanceQuery = "SELECT * FROM AttendanceSheet WHERE StudRoll = '" + studentRoll + "' AND isPresent = 1";

        int attendancePercent = 0;
        Cursor totalClasses = mDbHandler.execQuery(AttendanceListQuery);
        Cursor attendedClasses = mDbHandler.execQuery(AttendanceQuery);

        if (totalClasses == null) {
            Log.d("profile", "totalClasses null");
        }

        if (attendedClasses == null) {
            Log.d("profile", "attendedClasses null");
        }

        if (totalClasses != null && attendedClasses != null) {
            totalClasses.moveToFirst();
            attendedClasses.moveToFirst();

            try {
                attendancePercent = (int) (((float) attendedClasses.getCount() / totalClasses.getCount()) * 100);
            } catch (Exception e) {
                attendancePercent = -1;
            }
        }

        assert attendedClasses != null;
        assert totalClasses != null;
        String showAttendedLectures = String.valueOf(attendedClasses.getCount());
        String showTotalLectures = String.valueOf(totalClasses.getCount());
        //String showMissedLectures = String.valueOf(totalClasses.getCount() - attendedClasses.getCount());
        String AttendancePercentage = String.valueOf(attendancePercent);

        try {
            String[] arrStr = {studentsListCursor.getString(1), studentsListCursor.getString(0), showAttendedLectures, showTotalLectures, AttendancePercentage + " %"};
            csvWrite.writeNext(arrStr);

        } catch (Exception sqlException) {
            Toast.makeText(mActivity, "FAILED", Toast.LENGTH_SHORT).show();
            Log.e("MainActivity", sqlException.getMessage(), sqlException);
        }

        Toast.makeText(mActivity, "Saved", Toast.LENGTH_SHORT).show();
    }

    while (studentsListCursor.moveToNext());

    csvWrite.close();
}