Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
#1

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

15.12.2015, 19:26. Просмотров 281. Ответов 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);
        }
    }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2015, 19:26     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы
Посмотрите здесь:
Ускорить эмулятор андроид студии Android
Эмулятор Андроид не видит локальный сервер Android
Заставить эмулятор Андроид распознаваться, как мобильный девайс Android
Работа с готовой SQLite базой на андроид Android
По-разному работает на разных телефонах Android
Android По разному отображается на разных устройствах
Android Theme на телефоне и в Android Studio отображается по разному
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
15.12.2015, 20:05     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы #2
lostandleft, А если так?
Java
1
db.delete(DATABASE_TABLE_TRACKER, "time=?", new String[]{timeCach});
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
15.12.2015, 20:27  [ТС]     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
А если так?
Спасибо за интерес.
Нет, этот вариант пробовал еще вчера, грабли теже, на железе работает, на эмуляторе нет.

Оставил свой, как более понятный (для меня) с кавычками.
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
15.12.2015, 20:50     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы #4
lostandleft, а никаких ошибок нет при этом?
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
15.12.2015, 20:57  [ТС]     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы #5
Нет, красноты в логе нет.
По крайней мере я не вижу. Ошибка приложения не выскакивает, приложение продолжает работать.
Такое ощущение что TRY не отрабатывает.
но ошибку не вижу
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
15.12.2015, 20:59     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы #6
lostandleft, это чрезвычайно странно. Я бы удалил приложение сначала и поставил заново, посмотрел что в БД находится, прошёлся бы дебагом. Должно работать и на девайсе, и на эмуляторе
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2015, 00:36     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы
Еще ссылки по теме:
Эмулятор Android
Эмулятор Android Android
Android Не запускается эмулятор
Не работает эмулятор Android
Android Эмулятор не загружается

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

Или воспользуйтесь поиском по форуму:
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
16.12.2015, 00:36  [ТС]     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы #7
Нашел.
Кликните здесь для просмотра всего текста
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 );
Заработало
Yandex
Объявления
16.12.2015, 00:36     SQLite Андроид эмулятор и Железо по разному обрабатывают запросы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru