Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114

SQLite Андроид эмулятор и Железо по разному обрабатывают запросы

15.12.2015, 19:26. Показов 1084. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с задачкой по работе с SQLITE в общем в железе воплотить получилось, а в эмуляторе не работает, хочу понять почему.
Пожалуйста посмотрите исходники, если есть какие-то комментарии буду рад.
Повторюсь в Железе на GalaxySIV все работает отлично и никаких проблем я не вижу. В эмуляторе работает чуть лучше чем никак.
В коде есть все комментарии по этому поводу.

Кто готов помочь и оптимизировать мои сырцы, буду очень признателен.
Прошу конкретного решения, готового, если есть возможность пожалуйста напишите, Кнопка спасибо гарантирована

Кому хочется посквернословить в теме вроде "опять нубы фигней страдают" проходят мимо.
Может так сказаться, что мои ответы для Вас не всегда покажутся приятными и адекватными.



Все описание проблемы в коде:
В интерфейсе делаем кнопочку и текст вью, которое можно скролить:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1">
 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
 
 
 
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:text="Medium Text"
                    android:id="@+id/yourpoints"
                    android:layout_weight="0.16" />
    </ScrollView>
 
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:onClick="Points"
        android:id="@+id/Points"
        android:layout_gravity="center_horizontal"
        android:layout_weight="0.16" />
</LinearLayout>
В коде пишем:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package com.example.helloworld;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
 
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
 
 
public class FinalTry extends Activity
{
    //Устанавливаем таймер жизни записи (строки) в базе данных
    int timer = 60;
 
    //Говорим что будем работать с ТекстВью и кнопочкой
    TextView yourpoints;
    Button Points;
    //Активируем ДБХелпер
    DBHelper dbHelper;
    //Задаем переменную Времени, в виде строки
    String  mLastUpdateTime;
 
 
    private static final String DATABASE_NAME = "database.db";
    private static final String DATABASE_TABLE_TRACKER = "tracker";
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.morda);
 
        yourpoints = (TextView)findViewById(R.id.yourpoints);
        Points = (Button)findViewById(R.id.Points);
 
        dbHelper = new DBHelper(this);//говорим, что будем работать с БД в этом проекте, в дальнейшем откроем класс с названием DBHelper
 
  
        //Устанавливаем клик листнер
        Points.setOnClickListener(new View.OnClickListener()
 
        {
           @Override
           public void onClick(View v)
           {
            sqlTracker();
            }
        });
 
 
    }
 
 
    public void sqlTracker ()
    {
        // подключаемся к БД
        SQLiteDatabase db = dbHelper.getWritableDatabase();
 
        //Берем актуальное время
        mLastUpdateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(new Date());
 
       // создаем объект для данных
       ContentValues cv = new ContentValues();
        
        // получаем данные для ввода в таблицу
        String timeActual = new String(String.valueOf(mLastUpdateTime));
 
        //Получаем выборку из таблицы
        Cursor c = db.query(DATABASE_TABLE_TRACKER, null, null, null, null, null, null);
 
        // ставим позицию курсора на первую строку выборки
        // если в выборке нет строк, вернется false
 
            if (c.moveToFirst())//переходим на первую строку выборки
            {
                // определяем номера столбцов по имени в выборке
                int timeColIndex  = c.getColumnIndex("time"); // задаем переменную timeColIndex
 
 
                do {
 
                    //Читаем данные из таблицы
                    String timeCash = c.getString(timeColIndex);
 
                    //Делаем запись в текстовый вывод
                    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
                    Date d1 = null;
                    Date d2 = null;
                    long diff;
                    try {
                        d1 = format.parse(timeCash);
                        d2 = format.parse(mLastUpdateTime);
 
                        //Получаем разницу в секундах
                        diff = d2.getTime() - d1.getTime();
                        long diffSeconds = diff / 1000;
                        //Удаляем запись если она устарела больше чем указано в таймере
                        if (diffSeconds > timer)
                            {
                            //Со следующей строчкой засада, я бился больше суток, но никак не мог понять почему конструкция типа
                            //db.delete(DATABASE_TABLE_TRACKER, "time = "+timeCash , null);//Не работает ни в какую, уже чуть мышку не разбил,
                            //было ощущение что тип данных в таблице SQL не соответсвует типу данных в переменной timeCash.
                            //Нашел подтверждение на одном из форумов, что нужно поставить одинарные ковычки, в итоге изобрел костыль описанный ниже.
                            //С ним на реальном устройстве, (galaxy S4 - 5 версия андроида) все работает хорошо, никаким проблем нет, все так, как я задумывал.
                            //Но вот незадача в эмуляторе на гуглофоне нексус S не хочет кнопочка отрабатывать и никаких ошибок не выдает, и из базы данных SQL ничего
                            //не удаляет. Записи в SQL делает, но сообщение в ТексВью yourpoints.append не выводит, как будто вообще ничего не делает приложение.
                            //Но если к таблице SQL коннектиться на прямую через ADB то видно что записи в таблице создаются, но не удаляются.
                            //В общем следующая конструкция (костыль) отлично работает на моем аппарате, но не работает в эмуляторе, помогите разобраться.
                            db.delete(DATABASE_TABLE_TRACKER, "time = "+new String(String.valueOf("'"+timeCash+"'")) , null);
                            yourpoints.append("\nReading \n" + timeCash);
                            }
                        String difStr =  new String(String.valueOf(diffSeconds));
                        yourpoints.append("\nCalc \n"+difStr+"\nnow-"+d2+"\nSQl-"+d1);
                        } 
                    
                    catch (ParseException e) 
                        {
                        e.printStackTrace();
                        }
 
                        //Записываем новое время в базу
                    }
                        while (c.moveToNext());
                        long rowID =0;
                        cv.put("time", timeActual);
                        rowID = db.insert(DATABASE_TABLE_TRACKER, null, cv);
                        //Закрываем доступ к базе
                        c.close();
            }
            else
            {
                //Если не отработало условие выше, просто создаем новую запись в таблице и закрываем доступ
                long rowID =0;
                cv.put("time", timeActual);
                rowID = db.insert(DATABASE_TABLE_TRACKER, null, cv);
                c.close();
                yourpoints.setText("Соединение закрыто данные записаны");
            }
 
    }
 
 
//Описание класса DBHelper
    private class DBHelper  extends   SQLiteOpenHelper
    {
        public DBHelper (Context context)
        {
        //конструктор суперкласса, версия базы данных
        super (context ,   DATABASE_NAME ,  null ,   1 ) ;
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
 
            // создаем таблицу с полями
            db.execSQL("create table "+ DATABASE_TABLE_TRACKER + " ("
          + "id integer primary key autoincrement, "
          + "time text "
 
          +         ");" );
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+ DATABASE_TABLE_TRACKER);
            onCreate(db);
        }
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2015, 19:26
Ответы с готовыми решениями:

Почему разные браузеры по-разному обрабатывают код?
Код создания запроса у меня реализован в виде функции function createRequest() { try { request = new XMLHttpRequest(); ...

Как именно домашние роутеры обрабатывают запросы DNS?
Есть DNS-запросы рекурсивные и нерекурсивные. Роутер от ПК в любом случае получает рекурсивный запрос. А дальше, что он с ним делает: 1....

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

6
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
15.12.2015, 20:05
lostandleft, А если так?
Java
1
db.delete(DATABASE_TABLE_TRACKER, "time=?", new String[]{timeCach});
1
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
15.12.2015, 20:27  [ТС]
Цитата Сообщение от YuraAAA Посмотреть сообщение
А если так?
Спасибо за интерес.
Нет, этот вариант пробовал еще вчера, грабли теже, на железе работает, на эмуляторе нет.

Оставил свой, как более понятный (для меня) с кавычками.
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
15.12.2015, 20:50
lostandleft, а никаких ошибок нет при этом?
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
15.12.2015, 20:57  [ТС]
Нет, красноты в логе нет.
По крайней мере я не вижу. Ошибка приложения не выскакивает, приложение продолжает работать.
Такое ощущение что TRY не отрабатывает.
но ошибку не вижу
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
15.12.2015, 20:59
lostandleft, это чрезвычайно странно. Я бы удалил приложение сначала и поставил заново, посмотрел что в БД находится, прошёлся бы дебагом. Должно работать и на девайсе, и на эмуляторе
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
16.12.2015, 00:36  [ТС]
Нашел.
Кликните здесь для просмотра всего текста
12-15 17:55:35.540 12732-12732/com.example.helloworld W/System.err﹕ java.text.ParseException: Unparseable date: "12/15/15 7:57:57 AM" (at offset 2)

Не может спарсить дату, не понимаю почему.
На железе все отлично.

Добавлено через 1 минуту
Цитата Сообщение от YuraAAA Посмотреть сообщение
Я бы удалил приложение сначала и поставил заново
Проверялось не то что с нуля каждый раз, а на разных версиях андроида, и на 4 и на 6, везде одно и тоже

Добавлено через 3 минуты
Java
1
mLastUpdateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(new Date());
Я так понимаю что на разных версиях устройств по разному создается дата?
В Гуглофоне берется такой тип: 12/15/15 7:57:57 AM
А в самсунге создается dd.MM.yy HH:mm:ss

В этом проблема?
Я задаю маску
Java
1
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
Как обойти эту проблему чтобы на разных устройствах все работало одинаково корреатно?

Добавлено через 3 часа 30 минут
Все решил проблемку.
Нужно строго задавать маску на получение даты, и она соответсвовать должна маске для чтения
заменил это
Java
1
mLastUpdateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(new Date());
на это
Java
1
2
3
4
        Date currentDate = new Date();
        SimpleDateFormat dateFormat = null;
        dateFormat = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
        mLastUpdateTime = dateFormat.format( currentDate );
Заработало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2015, 00:36
Помогаю со студенческими работами здесь

Андроид эмулятор
Добрый день. Есть много эмуляторов под Андроид. Сейчас использую Genymotion. Но он очень ресурса ёмкий. Пишу программу под c#, и приложения...

C# + эмулятор андроид
Ребята, здорова. Подскажите как эмулировать установку приложения андроид? Каким образом можно соединить C# и эмулятор андроид? А также...

JAVA эмулятор на андроид
поскажите хороший java эмулятор на андроид который не требует роот прав и может считывать java приложения с карты памяти? может что-нибудт...

Эмулятор андроид Genymotion
Я установил эмулятор андроид Genymotion - он требует виртуал бокс для своей установки. Я его криво поставил(получил ошибку установки)....

Эмулятор для запуска пк приложений в системе андроид
Здравствуйте! Заранее прошу прощения, за свою полною неграмотность, но прошу помощи, подсказки. Для системы windows есть программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru