【问题标题】:ContextWrapper and AssetManager Errors in Android StudioAndroid Studio 中的 ContextWrapper 和 AssetManager 错误
【发布时间】:2021-08-09 23:06:18
【问题描述】:

我正在尝试在 Android Studio 中创建一个 Android 应用,使用 Java 将数据从 CSV 文件导入 SQLite 数据库。问题是当我尝试使用代码从 CSV 文件中读取时:

第一次尝试:

import android.os.Build;
import androidx.annotation.RequiresApi;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;

@RequiresApi(api = Build.VERSION_CODES.O)
public class LocalFileParser extends ActivityHome {
  final static Path PATH = Paths.get("src\\main\\res\\raw\\recipescsv.csv");
  File file = new File(String.valueOf(PATH));
  BufferedReader buffer;
  String line ="";
  String [] str;

    public LocalFileParser() throws IOException {
          try {
              InputStream inputStream = getResources().openRawResource(R.raw.recipescsv);
              BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
              reader.readLine();
              while ((line = reader.readLine()) != null) {
                  str = line.trim().split(",");
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
          parseToDb();
    }

  private void parseToDb() {
      for(int i=0; i< str.length; i++) {
        System.out.println("This is the array of file: "+str[i]); //For testing

        Database db = new Database(getApplicationContext());
        int id = Integer.parseInt(str[0]), execTime = Integer.parseInt(str[9]), difRate= Integer.parseInt(str[10]);
        double calories = Double.parseDouble(str[6]);
        db.writeJSONtoTheDB(id,str[1],str[2],str[3],str[4],str[5],calories,str[7],null,execTime,difRate);
      }
    }
}

此尝试的错误如下(在 ContextWrapper.java 中):

第二次尝试:

import android.content.Context;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class LocalFileParser extends ActivityHome {
        Context context;
        String fileName;
        List<String[]> rows = new ArrayList<>();

    public LocalFileParser(Context context, String fileName) {
        this.context = context;
        this.fileName = fileName;
    }

    public List<String[]> readCSV() throws IOException {
        InputStream is = context.getAssets().open(fileName);
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        String csvSplitBy = ",";

        br.readLine();

        while ((line = br.readLine()) != null) {
            String[] row = line.split(csvSplitBy);
            rows.add(row);
        }
        return rows;
    }
}

此尝试的错误如下(在 AssetManager.java 中):

项目的依赖(build.gradle(:app)):

dependencies {
    implementation 'com.opencsv:opencsv:4.6'
    implementation 'com.android.support:support-annotations:28.0.0'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.navigation:navigation-fragment:2.3.5'
    implementation 'androidx.navigation:navigation-ui:2.3.5'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
    testImplementation 'org.junit.jupiter:junit-jupiter'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    implementation 'com.squareup.okhttp:okhttp:2.5.0'
    implementation 'com.intellij:annotations:12.0@jar'
    implementation 'androidx.recyclerview:recyclerview:1.2.0'
    implementation 'de.hdodenhof:circleimageview:3.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'
}

Android Studio 无法解析某些导入(例如:Cannot resolve symbol 'AttrRes'),而对于其他导入,它会显示以下消息 'android.annotation.NonNull' is not public in 'android.annotation'. Cannot be accessed from outside package

谢谢你:)!

【问题讨论】:

    标签: java android dependencies


    【解决方案1】:

    您可以浏览AssetManagerContextWrapper等平台类进行参考,但不能使用公共SDK构建,出现此类错误是正常现象。对于应用开发,您无需构建它们,它们由 SDK 和 Android 平台提供。

    您发布的代码存在一些问题 - 如需帮助,请详细说明您需要帮助的问题。

    【讨论】:

    • 感谢您的回复!具体错误是: W/System.err: java.io.FileNotFoundException: recipescsv.scv W/System.err: at android.content.res.AssetManager.nativeOpenAsset(Native Method) PS: CSV 文件存在于 res 文件夹和它不是空的!
    • 真的是 .scv 还是 .csv?您还可以使用 AssetManager 打开资产,而不是原始资源。
    • 谢谢!这个问题终于用 JSON 文件和 AssetManager 解决了。
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多