DBUpdateModelImpl.java 7.16 KB
/*
 * Copyright (c) 2016 wugian
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.xgimi.gimicinema.model;

import android.content.Context;
import android.os.Handler;
import android.util.Log;

import com.gimi.common.cinema.db.NewDBManager;
import com.gimi.common.cinema.model.LocalMovieMessage;
import com.gimi.common.cinema.utils.Utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by 李攀 on 2016/9/21
 */
public class DBUpdateModelImpl implements IDBUpdateModel {

    private NewDBManager dbManager;
    private Handler handler = new Handler();

    @Override
    public void update(Context context, LocalMovieMessage lmm,
                       OnUpdateDbListener listener) {
        if (dbManager == null) {
            dbManager = new NewDBManager(context);
        }
        boolean b = dbManager.updateMovieMsg(lmm);
        if (b) {
            listener.updateDBSuccess();
        } else {
            listener.updateDBFailure();
        }
    }

    @Override
    public void updateMovieCount(Context context, LocalMovieMessage lmm) {
        if (dbManager == null) {
            dbManager = NewDBManager.getInstance();
        }
        dbManager.updateMovieCount(lmm);
    }

    @Override
    public void updatePlayTime(Context context, LocalMovieMessage lmm) {
        if (dbManager == null) {
            dbManager = NewDBManager.getInstance();
        }
        dbManager.updatePlayTime(lmm);
    }

    @Override
    public void insertAll(final Context context, final ArrayList<LocalMovieMessage> all,
                          final OnInsertDbListener l) {
        if (dbManager == null) {
            dbManager = NewDBManager.getInstance();
        }
        ThreadUtils.subThread(new ThreadUtils.DoSomeThing() {
            @Override
            public void doSomeThing() {
                try {
                    dbManager.addByTransaction(all);
                } catch (Exception e) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            l.insertFailure();
                        }
                    });
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Utils.saveLong(context, "db-last-update-time-db", System.currentTimeMillis());
                        l.insertSuccess(all.size());
                    }
                });

                try {
                    dbManager.deleteFileNotExists();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void insertDiff(Context context, ArrayList<LocalMovieMessage> oldInDb, ArrayList<LocalMovieMessage> newByScan, final OnClazzInsertListener l) {
        if (context == null) {
            return;
        }
        final List<LocalMovieMessage> diff = getDiff1(oldInDb, newByScan);
        Log.d("wugian", "╟  " + diff.toString());
        if (diff.size() == 0) {
            return;
        }
        if (dbManager == null) {
            dbManager = NewDBManager.getInstance();
        }
        ThreadUtils.subThread(new ThreadUtils.DoSomeThing() {
            @Override
            public void doSomeThing() {
                try {
                    dbManager.add(diff);
                } catch (Exception e) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            l.insertFailure();
                        }
                    });
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        l.insertSuccess(diff.size());
                    }
                });
            }
        });
    }

    public interface OnUpdateDbListener {
        void updateDBSuccess();

        void updateDBFailure();
    }

    public interface OnInsertDbListener {
        void insertSuccess(int size);

        void insertFailure();
    }

    public interface OnClazzInsertListener {
        void insertSuccess(int size);

        void insertFailure();
    }

    private static List<String> getDiffrent(List<String> list1, List<String> list2) {
        long st = System.nanoTime();
        List<String> diff;
        diff = new ArrayList<>();
        List<String> maxList = list1;
        List<String> minList = list2;
        if (list2.size() > list1.size()) {
            maxList = list2;
            minList = list1;
        }

        // 将List中的数据存到Map中
        Map<String, Integer> maxMap = new HashMap<>(maxList.size());
        for (String string : maxList) {
            maxMap.put(string, 1);
        }

        // max:1,2,3,4,5
        // min:2,4,6,8,10

        // 循环minList中的值,标记 maxMap中 相同的 数据2
        for (String string : minList) {
            // 相同的
            if (maxMap.get(string) != null) {
                maxMap.put(string, 2);
                continue;
            }
            // 不相等的
            diff.add(string);
        }

        // 循环maxMap
        for (Map.Entry<String, Integer> entry : maxMap.entrySet()) {
            if (entry.getValue() == 1) {
                diff.add(entry.getKey());
            }
        }

        System.out.println("getDiff total times " + (System.nanoTime() - st));
        return diff;
    }

    /**
     * 获取不同的电影列表,注意区分大小写
     *
     * @param oldList
     * @param newList
     * @return
     */
    private List<LocalMovieMessage> getDiff1(ArrayList<LocalMovieMessage> oldList, ArrayList<LocalMovieMessage> newList) {
        List<LocalMovieMessage> diff = new ArrayList<>();
        long l = System.currentTimeMillis();
        List<LocalMovieMessage> max = newList;
        List<LocalMovieMessage> min = oldList;
//        if (oldList.size() > newList.size()) {
//            max = oldList;
//            min = newList;
//        }

        Map<String, Integer> minMap = new HashMap<>();
        for (LocalMovieMessage localMovieMessage : min) {
            minMap.put(localMovieMessage.getPlayPath(), 1);
        }

        for (LocalMovieMessage localMovieMessage : max) {
            Integer integer = minMap.get(localMovieMessage.getPlayPath());
            if (integer != null && integer == 1) {
                continue;
            }
            diff.add(localMovieMessage);
        }
        Log.d("wugian", "waste time:" + (System.currentTimeMillis() - l));
        return diff;
    }


}