Xamarin / C # - Вставить данные в базу данных SQLite программно для нескольких таблиц? - PullRequest
0 голосов
/ 15 октября 2019

Мое приложение Xamarin извлекает данные из API и вставляет эти данные в таблицу SQLite. В настоящее время в API определено 9 таблиц, и в моем приложении 9 классов, соответствующих этим таблицам. Я использовал фрагмент кода из принятого ответа на этот вопрос: Получение всех типов в пространстве имен с помощью отражения

Ниже приведен мой код с использованием фрагмента из ответа и цикла foreach, который я пытаюсь выполнить. чтобы построить это, вставим данные.

string nspace = "App.Tables";
            var q = from t in Assembly.GetExecutingAssembly().GetTypes()
                    where t.IsClass && t.Namespace == nspace
                    select t.Name; // Getting list of classes as IEnumerable
            var L = q.ToList(); // Converting to List

            foreach (var name in L) // Inserts data for every class found
            {
                var response = await httpClient.Value.GetStringAsync("http://website.com/api/" + name + "s"); // Substitutes each class name into API url
                var data = JsonConvert.DeserializeObject<List<TableName>>(response); // Deserializes into List
                using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation)) // Opens database connection
                {
                    conn.CreateTable<TableName>(); // Create table
                    conn.DeleteAll<TableName>(); // Delete all old data
                    conn.InsertAll(data); // Inserts new data
                }
            }

Я не знаю, каким должно быть TableName, чтобы получить правильный класс для каждого элемента в списке. Например: скажем, список содержал строки Table1, Table2 и Table3 - он получил эти строки из пространства имен App.Tables, которое содержит три отдельных класса: Table1, Table2 и Table3. Когда первая часть кода получает список и сохраняет его как переменную L, он должен получить данные для каждой переменной «name» в L и затем вставить их в соответствующую таблицу. Как мне отнести это к таблице?

1 Ответ

1 голос
/ 15 октября 2019

Прежде чем дать свой ответ, я хотел бы сказать вам, что я не рекомендую обновлять таблицы с помощью рефлексии - таблицы должны содержать логически различные сущности, поэтому пакетное удаление и обновление их довольно странно. Это один из тех немногих случаев, когда я никогда не стал бы печатать обновления таблиц по очереди. Но это всего лишь два моих цента ... Конечно, если бы у меня было тысяча таблиц, мое мнение не соответствовало бы.

Этот вид рефлексии также делает ваш код трудным для отслеживания и отслеживания -Подумайте, как вы будете искать использование метода CreateTable<ExampleClass>()? Вы никогда не отследите это - или только благодаря огромным усилиям - что вы назвали это в этом фрагменте кода.

Итак, чтобы ответить на ваш вопрос ...

Сначала вы получитегруппа методов, затем создайте общую версию в зависимости от типа. Я думаю, что преобразование из Type в string не нужно для части, которую вы ищете, так как вам нужно преобразовать обратно в Type

using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation)) {
    MethodInfo nonGenMethodCreate = typeof(SQLiteConnection).GetMethod("CreateTable");
    MethodInfo nonGenMethodDeleteAll = typeof(SQLiteConnection).GetMethod("DeleteAll");
    MethodInfo nonGenMethodInsertAll = typeof(SQLiteConnection).GetMethod("InsertAll");

    foreach(Type t in Assembly.GetExecutingAssembly.GetTypes()) {
        MethodInfo genMethodCreate = nonGenMethodCreate.MakeGenericMethod(t);
        MethodInfo genMethodDeleteAll = nonGenMethodDeleteAll.MakeGenericMethod(t);
        MethodInfo genMethodInsertAll = nonGenMethodInsertAll.MakeGenericMethod(t);

        genMethodCreate.Invoke(conn, null);
        genMethodDeleteAll.Invoke(conn, null);
        genMethodInsertAll.Invoke(conn, new[] { data });

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...