Android проверить ошибку файла "Несоответствие типов: выведенный тип - это Контекст, но путь! Ожидался" - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь ввести локальное JSON хранилище в приложение, которое я создаю. Я использовал этот метод хранения JSON раньше, но я никогда не получал эти ошибки; Type mismatch: inferred type is Context but Path! was expected и Type mismatch: inferred type is String but LinkOption! was expected Ошибки выглядят следующим образом в контексте и JSON_FILE:

 constructor (context: Context) {
        this.context = context
        if (exists(context, JSON_FILE)) {
            deserialize()
        }
    }

Вот класс:

package ie.wit.models

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import org.jetbrains.anko.AnkoLogger
import java.nio.file.Files.exists
import kotlin.random.Random
import ie.wit.helpers.**/
import android.content.Context
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import org.jetbrains.anko.AnkoLogger
import ie.wit.helpers.*
import java.nio.file.Files.exists
import java.util.*


val JSON_FILE = "bookings.json"
val gsonBuilder = GsonBuilder().setPrettyPrinting().create()
val listType = object: TypeToken<ArrayList<ValetModel>>(){}.type

fun generateRandomId(): Long {
    return Random().nextLong()
}

class ValetJSONStore: ValetStore, AnkoLogger{
    val context: Context
    var bookings = mutableListOf<ValetModel>()

    constructor (context: Context) {
        this.context = context
        if (exists(context, JSON_FILE)) {
            deserialize()
        }
    }

    override fun findAll(): List<ValetModel> {
        return bookings
    }


    override fun create(valet: ValetModel) {
        valet.id = generateRandomId()
        bookings.add(valet)
        serialize()
    }

    override fun update(valet: ValetModel) {
        val bookingsList = findAll() as ArrayList<ValetModel>
        var foundBooking: ValetModel? = bookingsList.find{p -> p.id == valet.id}
        if(foundBooking != null){
            foundBooking.brand = valet.brand
            foundBooking.model = valet.model
            foundBooking.numberPlate = valet.numberPlate
            foundBooking.date = valet.date
        }
        serialize()
    }

    override fun delete(valet: ValetModel) {
        bookings.remove(valet)
        serialize()
    }

    private fun serialize(){
        val jsonString = gsonBuilder.toJson(bookings, listType)
        write(context, JSON_FILE, jsonString)
    }

    private fun deserialize() {
        val jsonString = read(context, JSON_FILE)
        bookings = Gson().fromJson(jsonString, listType)
    }

}

1 Ответ

1 голос
/ 14 февраля 2020

Чтобы объяснить, почему вы получаете эту ошибку: Если вы проверите документацию для exists(..) для import java.nio.file.Files.exists, она ожидает Path, а не Context:

/**
     * Tests whether a file exists.
     *
     * <p> The {@code options} parameter may be used to indicate how symbolic links
     * are handled for the case that the file is a symbolic link. By default,
     * symbolic links are followed. If the option {@link LinkOption#NOFOLLOW_LINKS
     * NOFOLLOW_LINKS} is present then symbolic links are not followed.
     *
     * <p> Note that the result of this method is immediately outdated. If this
     * method indicates the file exists then there is no guarantee that a
     * subsequence access will succeed. Care should be taken when using this
     * method in security sensitive applications.
     *
     * @param   path
     *          the path to the file to test
     * @param   options
     *          options indicating how symbolic links are handled
     * .
     * @return  {@code true} if the file exists; {@code false} if the file does
     *          not exist or its existence cannot be determined.
     *
     * @throws  SecurityException
     *          In the case of the default provider, the {@link
     *          SecurityManager#checkRead(String)} is invoked to check
     *          read access to the file.
     *
     * @see #notExists
 */
public static boolean exists(Path path, LinkOption... options) {
    try {
        if (followLinks(options)) {
            provider(path).checkAccess(path);
        } else {
            // attempt to read attributes without following links
            readAttributes(path, BasicFileAttributes.class,
                           LinkOption.NOFOLLOW_LINKS);
        }
        // file exists
        return true;
    } catch (IOException x) {
        // does not exist or unable to determine if file exists
        return false;
    }

}

Возможно, в других классах, где вы реализовали то же самое, возможно, вы пытаетесь использовать метод exists(..), импортированный из другого места, отличного от java.nio.file.Files.exists?

Чтобы проверить, существует этот файл или нет, у вас есть много вариантов, но сейчас я могу перечислить вам два варианта, один из которых вы уже пытались использовать (существует (..), который доступен из API 26):

package com.example.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import java.io.File
import java.nio.file.Files.exists
import java.nio.file.Paths


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val JSON_FILE = "bookings.json"

        // One option to check if file exists (available from API 26)
        if (exists(Paths.get(JSON_FILE))) {
            //
        }

        // Another option to check if file exists (available from API 1)
        val file = File(JSON_FILE)
        if (file.exists()) {
            //
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...