在非活动类中获取应用程序上下文以传递CSV文件

时间:2016-06-16 19:53:47

标签: java android csv

我试图弄清楚如何读取存储在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 []数组(各个类别),然后填充mCat​​egory []数组中的每个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解析器?

2 个答案:

答案 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);
}