我试图弄清楚如何读取存储在assets文件夹中的CSV文件。我尝试做的是使用InputFileStream,因为我无法找到FileReader来查找文件。所以我将文件放入assets文件夹并使用InputFileStream。
为此,我使用了AssetManager。问题是这是一个非活动类,从主活动中传递上下文真的很难,因为它是一系列大的方法。
以loadCategory():
开头 loadCategory(0);
在术语中称为ToolSource类(单例):
public void loadCategory(int categoryIndex) {
...
ToolsCategory cat = ToolsSource.getInstance().getCategory(categoryIndex);
创建一个ToolCategories []:
数组 public static ToolsSource getInstance() {
if (instance == null) {
try {
instance = new ToolsSource();
} catch (IOException e) {
e.printStackTrace();
}
}
return instance;
}
public ToolsSource() throws IOException {
int i;
mCategory = new ToolsCategory[CATEGORIES.length];
for (i = 0; i < CATEGORIES.length; i++) {
mCategory[i] = new ToolsCategory(CATEGORIES[i]);
}
}
最终到达发生此错误的主类。这个类的要点是填充Tool []数组(各个类别),然后填充mCategory []数组中的每个ToolCategories。 LoadCategory加载调用getCategory(0),它在mCategory []中提取第一个类别的名称,并通过适配器分配它。
我想要做的是将包含所有工具信息的CSV解析为CSV中代表每个类别的单独行。例如categoryName.csv包含3行ergo 3工具。
然后迭代并将3行中的信息分配给类Tool()的成员字段。例如MTOOLS [I] .setTitle(nextLine [0]);
package com.anothergamedesigner.listviewtest;
import android.content.Context;
import android.content.res.AssetManager;
import com.opencsv.CSVReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ToolsCategory {
final int TOOLS_PER_CATEGORY = 10;
Context context;
private CSVReader reader;
private String categoryName;
Tool[] mTools;
public ToolsCategory(String name) throws IOException {
this.context = context.getApplicationContext();
AssetManager assetManager = context.getAssets();
categoryName = name;
mTools = new Tool[TOOLS_PER_CATEGORY];
assignValues(categoryName, assetManager);
}
private void assignValues(String name, AssetManager am) {
String categoryCSV = name + ".csv";
System.out.println("category name is: "+ categoryCSV);
int i;
for(i= 0; i<mTools.length; ++i){
try {
InputStream csvStream = am.open(categoryCSV);
InputStreamReader csvStreamReader = new InputStreamReader(csvStream);
reader = new CSVReader(csvStreamReader);
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println("New title is: " + nextLine[0]);
mTools[i].setTitle(nextLine[0]);
System.out.println("New Subtitle is: " + nextLine[0]);
mTools[i].setSubtitleTxt(nextLine[1]);
System.out.println("New Description is: " + nextLine[0]);
mTools[i].setDescriptionTxt(nextLine[2]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public int getToolCount(){
return mTools.length;
}
public Tool getTool(int index){
return mTools[index];
}
}
但是,我收到的错误表明: 尝试调用虚方法&#39; android.content.Context android.content.Context.getApplicationContext()&#39;在null对象引用上。
有没有办法让我修复这个或另一种方法来检索csv的Uri /文件路径,以便我可以将它提供给CSVReader解析器?
答案 0 :(得分:1)
您只需将上下文作为参数传递给构造函数。
Context c;
...
public ToolsCategory(String name, Context c) throws IOException {
this.c= c;
...
}
答案 1 :(得分:1)
您需要提供活动背景
loadCategory(0); - > loadCategory(0, this);
像这样修复代码:
1
public void loadCategory(int categoryIndex, Context context) {
...
ToolsCategory cat = ToolsSource.getInstance(context).getCategory(categoryIndex);
2
public static ToolsSource getInstance(Context context) {
if (instance == null) {
try {
instance = new ToolsSource(context);
} catch (IOException e) {
e.printStackTrace();
}
}
return instance;
}
3
public ToolsSource(Context context) throws IOException {
int i;
mCategory = new ToolsCategory[CATEGORIES.length];
for (i = 0; i < CATEGORIES.length; i++) {
mCategory[i] = new ToolsCategory(CATEGORIES[i], context);
}
}
4
public ToolsCategory(String name, Context context) throws IOException {
this.context = context;
AssetManager assetManager = context.getAssets();
categoryName = name;
mTools = new Tool[TOOLS_PER_CATEGORY];
assignValues(categoryName, assetManager);
}