将数据库另存为 CSV 文件

Posted

技术标签:

【中文标题】将数据库另存为 CSV 文件【英文标题】:Save Database as CSV File 【发布时间】:2018-05-29 21:31:37 【问题描述】:

我是新人。当用户通过测试时,我得到了一个有 4 次考试的应用程序。用户名和带有跟踪代码的考试日期和答案将保存在数据库中。另一方面,用户可以看到已经保存在数据库中的考试结果,并且我有一个显示来自数据库(SQlite 数据库)的数据的列表视图,所以我有一个按钮,当用户单击它时,它应该将数据库保存为 CSV文件。我已经在我的项目中导入了 OPENCSV 库。所以我在我的 BUTTON 中编写代码。但是在运行时,当我单击按钮时。什么都不会发生。在 logcat 中我得到错误:

05-29 21:17:43.198 2531-2531/ir.arbn.www.mytestprogramsamanik E/ResultActivity: 尝试调用虚拟方法 'android.database.sqlite.SQLiteDatabase ir.arbn.www.mytestprogramsamanik.DatabaseHelper.getReadableDatabase ()' 在空对象引用上 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.database.sqlite.SQLiteDatabase ir.arbn.www.mytestprogramsamanik.DatabaseHelper.getReadableDatabase()”


数据库类:

public class DatabaseHelper extends SQLiteOpenHelper 
public static final String DATABASE_NAME = "person.db";
public static final int VERSION = 1;
public static final String TABLE_NAME = "tbl_person";
public static final String S_ID = "id";
public static final String S_NAME = "name";
public static final String S_DATE = "date";
public static final String S_TRACK = "track";
public static final String S_ANSWER = "answer";
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "" + "(" + S_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + S_NAME + " TEXT NOT NULL," + S_DATE + " TEXT NOT NULL," + S_TRACK + " TEXT NOT NULL," + S_ANSWER + " TEXT NOT NULL)";

public DatabaseHelper(Context context) 
    super(context, DATABASE_NAME, null, VERSION);


public void insertPerson(String name, String date, String track, String answer) 
    ContentValues contentValues = new ContentValues();
    contentValues.put(S_NAME, name);
    contentValues.put(S_DATE, date);
    contentValues.put(S_TRACK, track);
    contentValues.put(S_ANSWER, answer);
    SQLiteDatabase db = this.getWritableDatabase();
    db.insert(TABLE_NAME, null, contentValues);
    db.close();


@Override
public void onCreate(SQLiteDatabase db) 
    db.execSQL(CREATE_TABLE);


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)      
    db.execSQL("DROP TABLE" + TABLE_NAME);
    onCreate(db);


public ArrayList<PersonModel> getAllPersonData() 
    ArrayList<PersonModel> list = new ArrayList<>();
    String sql = "SELECT * FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(sql, null);
    if (cursor.moveToFirst()) 
        do 
            PersonModel pm = new PersonModel();
            pm.setId(cursor.getInt(0) + "");
            pm.setName(cursor.getString(1));
            pm.setDate(cursor.getString(2));
            pm.setTrack(cursor.getString(3));
            pm.setAnswer(cursor.getString(4));
            list.add(pm);
         while (cursor.moveToNext());
    
    return list;



即使在这里您也可以看到带有列表视图和保存按钮的活动:

public class ResultActivity extends AppCompatActivity 
@BindView(R.id.listView)
ListView listView;
@BindView(R.id.save)
CustomButton save;
CustomAdapter customAdapter;
ArrayList<PersonModel> arrayList;
DatabaseHelper db;
DatabaseHelper dbhelper;
Context mContext = this;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);
    ButterKnife.bind(this);
    db = new DatabaseHelper(this);
    arrayList = new ArrayList<>();
    arrayList = db.getAllPersonData();
    customAdapter = new CustomAdapter(this, arrayList);
    listView.setAdapter(customAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            Intent intent = new Intent(mContext, FragmentActivity.class);
            startActivity(intent);
        
    );
    save.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
           DatabaseHelper db = new DatabaseHelper(getApplicationContext());
            File exportDir = new File(Environment.getExternalStorageDirectory(), "");
            if (!exportDir.exists()) 
                exportDir.mkdirs();
            
            File file = new File(exportDir, "csvname.csv");
            try 
                file.createNewFile();
                    CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
                SQLiteDatabase myDb = dbhelper.getReadableDatabase();
                Cursor curCSV = myDb.rawQuery("SELECT * FROM tbl_person", null);
                csvWrite.writeNext(curCSV.getColumnNames());
                while (curCSV.moveToNext()) 
                    String arrStr[] = curCSV.getString(0), curCSV.getString(1), curCSV.getString(2);
                    csvWrite.writeNext(arrStr);
                
                csvWrite.close();
                curCSV.close();
             catch (Exception sqlEx) 
                Log.e("ResultActivity", sqlEx.getMessage(), sqlEx);
            
        
    );


【问题讨论】:

不初始化就使用dbHelper 我想我已经做到了。 我想知道为什么人们对我的帖子给予负面评价... 因为这是一个您可以自己解决的错误。 NullPointerExceptions 是 Java 101,当您偶然发现它们时,您应该进行调查。老实说,我怀疑您在将错误发布到 S.O. 之前一直在寻找自己的错误 当有人发布问题时,表示他/她已经搜索过问题。这个地方是我们可以提出问题并获得帮助的地方。对于问题。而且不管是什么问题。 【参考方案1】:

您的变量名似乎有误: 你实例化你的对象db

 DatabaseHelper db = new DatabaseHelper(getApplicationContext());

但是你在下面使用dbhelper

SQLiteDatabase myDb = dbhelper.getReadableDatabase();

未初始化,并抛出 NullPointer。

把上面那行改成SQLiteDatabase myDb = db.getReadableDatabase();

【讨论】:

谢谢。你让我喜欢:-)。但我有一个问题。当我点击按钮时。文件将保存在根目录下。我怎样才能将它保存在下载路径或用户想要的地方 嗯,这是一个完全不同的问题,我得参考this post给你答案

以上是关于将数据库另存为 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

Spark-Scala:另存为 csv 文件(RDD)[重复]

如何将 Excel 文件另存为 CSV? [复制]

将Excel文件另存为CSV

VBA 另存为 CSV 文件被第一张表覆盖

Applescript Excel 2016 另存为 CSV

excel另存为csv打开后有大量逗号是怎么回事?