Дата: 16/01/18 - 12:08 pm   9427 Тем и 91954 Сообщений

Автор Тема: Вирусы под андроид. №4  (Прочитано 3552 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Марта 27, 2016, 10:09:50 pm
Прочитано 3552 раз

Ar3s

  • Гость

Привет дорогой друг, что-то я запозднился с очередным материалом. Ну, не будем о печальном. Рано или поздно у тебя встанет вопрос: а как же правильно стучать? Да, да, именно стучать. Мы сделали запрос-ответ в админку (данные в памяти), а там случилось 404 или еще какая ни будь страшная беда. Данные канули в лету, так как сервис завершился.

Что же делать? Я опишу два способа, но первый будет в качестве примера, а второй покажет Вам, как делать правильно.

Метод плоских файлов

Дописывать в конец файла, а при отправке очищать файл. Структура файла:
{json}\n
{json}\n
.........
{json}\n
Код чтения всего файла:
File fl = new File(filePath);
FileInputStream fin = new FileInputStream(fl);
String ret = convertStreamToString(fin);
fin.close();

try {
    FileWriter fw = new FileWriter(filePath, true);
    fw.write(Value + "\n");
    fw.close();
} catch (IOException ioe) {

}

Тут ничего сложного: читай, пиши. Есть одно “Но”. Мы работаем в потоках, и может случиться одновременная запись и удаление, а это надо контролировать. Но мы же спецы, нам надо сделать чтобы было  круто. И мы переходим к базам данных.

Mysqli или как хранить данные по ФенШую

Мы рассмотрим работу с базой данных на примере чтения и записи. У нас простая табличка, где будут ID и StringJSON, которую после отправки мы будем очищать.
public class KNOCKERDatabase extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "knocker";
    private static final String TABLE_KNOCKER = "knocker";
    private static final String KEY_ID = "id";
    private static final String KEY_JSON = "stringjson";

    public KNOCKERDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE = "CREATE TABLE " + TABLE_KNOCKER + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"
                + KEY_JSON + " TEXT,"

                + ")";
        db.execSQL(CREATE_TABLE);
    }

    void addJson(String json) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_JSON, json);

        db.insert(TABLE_KNOCKER, null, values);
        db.close();
    }

    public List<String> getAllJson() {
        List<String> jsons = new ArrayList<String>();
        String selectQuery = "SELECT  * FROM " + TABLE_KNOCKER;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                jsons.add(cursor.getString(1));
            } while (cursor.moveToNext());
        }
        return jsons;
    }

    public void deleteRows(String num) {
        SQLiteDatabase db = this.getWritableDatabase();
  String del ="delete from " + TABLE_KNOCKER + " where " + KEY_ID + " in (select " + KEY_ID + " from " + TABLE_KNOCKER + " order by _id LIMIT " + num + ");";
        db.execSQL(del);
        db.close();
    }


    public int getCount() {
        String countQuery = "SELECT  * FROM " + TABLE_KNOCKER;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();
        return cursor.getCount();
    }
}
Теперь можно перейти к практике, как это использовать.

Шаг первый. Запись.
KNOCKERDatabase db = new KNOCKERDatabase(context);
db.addJson(DATA);
Где DATA – это запрос для отправки на сервер.

Шаг второй. Чтение.
Цитировать
KNOCKERDatabase db = new KNOCKERDatabase(this);
List<String> jsons = db.getAllJson();
После прочтения записей, считаем их количество (через getCount), чтобы не удалить лишнее и избавляемся от них через deleteRows.

Всем хороших отстуков. :)

Комментарий модератора [Ar3s:]  Автор перестал у нас постить материалы, а цикл статей хотелось бы закончить. Взял на себя перепост с указанием авторства и первоисточника.
Автор материала.
Источник: https://vxlab.info/blog/2016/03/23/%D0%B2%D...E-%D1%81%D1%82/

Марта 28, 2016, 11:45:59 pm
Ответ #1

TrueMind

  • Модератор

  • Оффлайн
  • ***

  • 162
    06.10.13
  • Reputation:
    58
Цитировать
Автор перестал у нас постить материалы, а цикл статей хотелось бы закончить. Взял на себя перепост с указанием авторства и первоисточника.

Комментарий модератора [TrueMind:]  Это кто такие недобросовестные у нас? :) Не уж то ребята из coru?
Изя... нельзя просто так взять и переманить автора статей к себе...!
Главная польза капитала не в том, чтобы сделать больше денег, но в том, чтобы делать деньги ради улучшения жизни. © Генри Форд
[email protected] - велком :)

Марта 30, 2016, 12:14:58 am
Ответ #2

Ar3s

  • Гость
Думаю к Изгою тут вопросов нет. Валентин скорее всего постарался и переманил автора на свой блог - vxlab