Sử dụng Google Base và Google Gears để có trải nghiệm hiệu quả khi không có mạng

Bài viết đầu tiên trong loạt bài "Xây dựng các ứng dụng Ajax hiệu quả hơn bằng Google API".

Dion Almaer và Pamela Fox, Google
Tháng 6 năm 2007

Lưu ý của biên tập viên: Google Gears API không còn hoạt động nữa.

Giới thiệu

Kết hợp Google Base với Google Gears, chúng tôi minh hoạ cách tạo một ứng dụng có thể sử dụng khi không có mạng. Sau khi đọc bài viết này, bạn sẽ quen thuộc hơn với Google Base API, cũng như hiểu cách sử dụng Google Gears để lưu trữ và truy cập vào các lựa chọn ưu tiên và dữ liệu của người dùng.

Tìm hiểu về ứng dụng

Để hiểu rõ ứng dụng này, trước tiên bạn nên làm quen với Google Base. Đây về cơ bản là một cơ sở dữ liệu lớn về các mặt hàng thuộc nhiều danh mục như sản phẩm, bài đánh giá, công thức nấu ăn, sự kiện và nhiều danh mục khác.

Mỗi mục đều được chú thích bằng tiêu đề, nội dung mô tả, đường liên kết đến nguồn dữ liệu ban đầu (nếu có), cùng với các thuộc tính bổ sung khác nhau theo từng loại danh mục. Google Base tận dụng thực tế là các mặt hàng trong cùng một danh mục có chung một bộ thuộc tính – ví dụ: tất cả các công thức đều có thành phần. Các mặt hàng trên Google Base đôi khi sẽ xuất hiện trong kết quả tìm kiếm trên Google Tìm kiếm hoặc Google Tìm kiếm sản phẩm.

Ứng dụng minh hoạ của chúng tôi, Base with Gears, cho phép bạn lưu trữ và hiển thị các cụm từ tìm kiếm phổ biến mà bạn có thể thực hiện trên Google Base, chẳng hạn như tìm công thức nấu ăn có từ khoá "sô cô la" (ngon) hoặc quảng cáo cá nhân có từ khoá "đi dạo trên bãi biển" (lãng mạn!). Bạn có thể coi đây là một "Google Base Reader" cho phép bạn đăng ký theo dõi các nội dung tìm kiếm và xem kết quả mới nhất khi truy cập lại ứng dụng hoặc khi ứng dụng tìm kiếm nguồn cấp dữ liệu mới nhất sau mỗi 15 phút.

Những nhà phát triển muốn mở rộng ứng dụng có thể thêm nhiều tính năng khác, chẳng hạn như cảnh báo trực quan cho người dùng khi kết quả tìm kiếm có kết quả mới, cho phép người dùng đánh dấu (gắn dấu sao) các mục yêu thích (ngoại tuyến + trực tuyến) và cho phép người dùng thực hiện các tìm kiếm thuộc tính theo danh mục như Google Base.

Sử dụng nguồn cấp dữ liệu API dữ liệu của Google Base

Bạn có thể truy vấn Google Base theo phương thức lập trình bằng Google Base Data API (tuân thủ khung Google Data API). Giao thức Google Data API cung cấp một giao thức đơn giản để đọc và ghi trên web, đồng thời được nhiều sản phẩm của Google sử dụng: Picasa, Trang tính, Blogger, Lịch, Sổ tay và nhiều sản phẩm khác.

Định dạng Google Data API dựa trên XML và Atom Publishing Protocol, vì vậy, hầu hết các hoạt động đọc/ghi đều ở định dạng XML.

Sau đây là ví dụ về một nguồn cấp dữ liệu Google Base dựa trên Google Data API:
http://www.google.com/base/feeds/snippets/-/products?bq=digital+camera

Loại nguồn cấp dữ liệu snippets cung cấp cho chúng tôi nguồn cấp dữ liệu công khai về các mặt hàng. -/products cho phép chúng tôi giới hạn nguồn cấp dữ liệu ở danh mục sản phẩm. Tham số bq= cho phép chúng ta hạn chế nguồn cấp dữ liệu hơn nữa, chỉ cho phép kết quả chứa từ khoá "máy ảnh kỹ thuật số". Nếu xem nguồn cấp dữ liệu này trong trình duyệt, bạn sẽ thấy XML chứa các nút <entry> có kết quả phù hợp. Mỗi mục nhập đều chứa các phần tử thông thường như tác giả, tiêu đề, nội dung và đường liên kết, nhưng cũng đi kèm với các thuộc tính bổ sung theo danh mục cụ thể (chẳng hạn như "giá" cho các mục trong danh mục sản phẩm).

Do hạn chế về nhiều miền của XMLHttpRequest trong trình duyệt, chúng tôi không được phép đọc trực tiếp trong nguồn cấp dữ liệu XML từ www.google.com trong mã JavaScript. Chúng ta có thể thiết lập một proxy phía máy chủ để đọc XML và xuất lại XML tại một vị trí trên cùng miền với ứng dụng của mình, nhưng chúng ta muốn tránh hoàn toàn việc lập trình phía máy chủ. Thật may là có một lựa chọn thay thế.

Giống như các API dữ liệu khác của Google, API dữ liệu Google Base có một lựa chọn đầu ra JSON, ngoài XML tiêu chuẩn. Đầu ra cho nguồn cấp dữ liệu mà chúng ta đã thấy trước đó ở định dạng JSON sẽ có tại URL này:
http://www.google.com/base/feeds/snippets/-/products?bq=digital+camera&alt=json

JSON là một định dạng trao đổi có kích thước nhẹ, cho phép lồng phân cấp cũng như nhiều loại dữ liệu. Nhưng quan trọng hơn là đầu ra JSON chính là mã JavaScript gốc, vì vậy, bạn có thể tải mã này vào trang web của mình chỉ bằng cách tham chiếu mã đó trong thẻ tập lệnh, bỏ qua hạn chế về nhiều miền.

Google Data API cũng cho phép bạn chỉ định đầu ra "json-in-script" bằng một hàm gọi lại để thực thi sau khi JSON được tải. Điều này giúp bạn dễ dàng làm việc với đầu ra JSON hơn nữa, vì chúng ta có thể tự động thêm các thẻ tập lệnh vào trang và chỉ định các hàm gọi lại khác nhau cho từng thẻ.

Vì vậy, để tải động một nguồn cấp dữ liệu JSON của Base API vào trang, chúng ta có thể sử dụng hàm sau đây để tạo một thẻ tập lệnh có URL nguồn cấp dữ liệu (được thêm các giá trị altcallback) và thêm thẻ đó vào trang.

function getJSON() {
  var script = document.createElement('script');

  var url = "http://www.google.com/base/feeds/snippets/-/products?bq=digital+camera";
  script.setAttribute('src', url + "&alt=json-in-script&callback=listResults");
  script.setAttribute('type', 'text/JavaScript');
  document.documentElement.firstChild.appendChild(script);
}

Giờ đây, hàm callback listResults của chúng ta có thể lặp lại thông qua JSON được truyền vào dưới dạng tham số duy nhất và hiển thị thông tin về từng mục nhập tìm thấy trong danh sách có dấu đầu dòng.

  function listTasks(root) {
    var feed = root.feed;
    var html = [''];
    html.push('<ul>');
    for (var i = 0; i < feed.entry.length; ++i) {
      var entry = feed.entry[i];
      var title = entry.title.$t;
      var content = entry.content.$t;
      html.push('<li>', title, ' (', content, ')</li>');
    }
    html.push('</ul>');

    document.getElementById("agenda").innerHTML = html.join("");
  }

Thêm Google Gears

Giờ đây, chúng ta đã có một ứng dụng có thể giao tiếp với Google Base thông qua Google Data API. Chúng ta muốn cho phép ứng dụng này chạy ở chế độ ngoại tuyến. Đây là lúc Google Gears phát huy tác dụng.

Có nhiều lựa chọn về cấu trúc khi viết một ứng dụng có thể chuyển sang chế độ ngoại tuyến. Bạn sẽ tự hỏi về cách ứng dụng hoạt động khi có mạng so với khi không có mạng (ví dụ: Ứng dụng có hoạt động giống hệt nhau không? Một số tính năng có bị tắt không, chẳng hạn như tính năng tìm kiếm? Bạn sẽ xử lý việc đồng bộ hoá như thế nào?)

Trong trường hợp của chúng tôi, chúng tôi muốn đảm bảo rằng người dùng trên các trình duyệt không có Gears vẫn có thể sử dụng ứng dụng, đồng thời mang lại cho người dùng có trình bổ trợ này những lợi ích khi sử dụng ngoại tuyến và giao diện người dùng có khả năng phản hồi cao hơn.

Cấu trúc của chúng tôi có dạng như sau:

  • Chúng tôi có một đối tượng JavaScript chịu trách nhiệm lưu trữ các cụm từ tìm kiếm của bạn và trả về kết quả từ những cụm từ tìm kiếm này.
  • Nếu đã cài đặt Google Gears, bạn sẽ nhận được phiên bản Gears lưu trữ mọi thứ trong cơ sở dữ liệu cục bộ.
  • Nếu chưa cài đặt Google Gears, bạn sẽ nhận được một phiên bản lưu trữ các cụm từ tìm kiếm trong cookie và hoàn toàn không lưu trữ kết quả đầy đủ (do đó, khả năng phản hồi chậm hơn một chút), vì kết quả quá lớn để lưu trữ trong cookie.
Ưu điểm của cấu trúc này là bạn không phải kiểm tra if (online) {} ở mọi nơi. Thay vào đó, ứng dụng có một lần kiểm tra Gears, sau đó bộ chuyển đổi phù hợp sẽ được sử dụng.


Sử dụng Cơ sở dữ liệu cục bộ của Gears

Một trong các thành phần của Gears là cơ sở dữ liệu SQLite cục bộ được nhúng và sẵn sàng để bạn sử dụng. Có một API cơ sở dữ liệu đơn giản mà bạn sẽ thấy quen thuộc nếu trước đây đã sử dụng API cho các cơ sở dữ liệu phía máy chủ như MySQL hoặc Oracle.

Các bước sử dụng cơ sở dữ liệu cục bộ khá đơn giản:

  • Khởi động các đối tượng Google Gears
  • Lấy một đối tượng ban đầu của cơ sở dữ liệu và mở một cơ sở dữ liệu
  • Bắt đầu thực thi các yêu cầu SQL

Hãy cùng tìm hiểu nhanh về những yếu tố này.


Khởi tạo các đối tượng Google Gears

Ứng dụng của bạn phải đọc nội dung của /gears/samples/gears_init.js một cách trực tiếp hoặc bằng cách dán mã vào tệp JavaScript của riêng bạn. Sau khi <script src="..../gears_init.js" type="text/JavaScript"></script> hoạt động, bạn sẽ có quyền truy cập vào không gian tên google.gears.


Nhận đối tượng Database Factory và mở cơ sở dữ liệu
var db = google.gears.factory.create('beta.database', '1.0');
db.open('testdb');

Lệnh gọi này sẽ cung cấp cho bạn một đối tượng cơ sở dữ liệu cho phép bạn mở một giản đồ cơ sở dữ liệu. Khi bạn mở cơ sở dữ liệu, chúng sẽ được phạm vi theo các quy tắc chính sách cùng nguồn gốc, vì vậy "testdb" của bạn sẽ không xung đột với "testdb" của tôi.


Bắt đầu thực thi các yêu cầu SQL

Giờ đây, chúng ta đã sẵn sàng gửi các yêu cầu SQL đến cơ sở dữ liệu. Khi gửi yêu cầu "select", chúng ta sẽ nhận được một tập hợp kết quả mà chúng ta có thể lặp lại để lấy dữ liệu mong muốn:

var rs = db.execute('select * from foo where name = ?', [ name ]);

Bạn có thể thao tác trên tập kết quả được trả về bằng các phương thức sau:

booleanisValidRow()
voidnext()
voidclose()
intfieldCount()
stringfieldName(int fieldIndex)
variantfield(int fieldIndex)
variantfieldByName(string fieldname)

Để biết thêm thông tin chi tiết, vui lòng xem tài liệu về Database Module API. (Lưu ý của biên tập viên: Google Gears API không còn được cung cấp nữa).


Sử dụng GearsDB để đóng gói API cấp thấp

Chúng tôi muốn đóng gói và giúp một số tác vụ cơ sở dữ liệu thường gặp trở nên thuận tiện hơn. Ví dụ:

  • Chúng tôi muốn có một cách hay để ghi lại SQL được tạo khi chúng tôi gỡ lỗi ứng dụng.
  • Chúng tôi muốn xử lý các trường hợp ngoại lệ ở một nơi thay vì phải try{}catch(){} ở mọi nơi.
  • Chúng tôi muốn xử lý các đối tượng JavaScript thay vì các tập hợp kết quả khi đọc hoặc ghi dữ liệu.

Để xử lý các vấn đề này theo cách chung, chúng tôi đã tạo GearsDB, một thư viện nguồn mở bao bọc đối tượng Cơ sở dữ liệu. Bây giờ, chúng ta sẽ xem cách sử dụng GearsDB.

Thiết lập ban đầu

Trong mã window.onload, chúng ta cần đảm bảo rằng các bảng cơ sở dữ liệu mà chúng ta dựa vào đã được thiết lập. Nếu người dùng đã cài đặt Gears khi mã sau chạy, họ sẽ tạo một đối tượng GearsBaseContent:

content = hasGears() ? new GearsBaseContent() : new CookieBaseContent();

Tiếp theo, chúng ta sẽ mở cơ sở dữ liệu và tạo các bảng nếu chúng chưa tồn tại:

db = new GearsDB('gears-base'); // db is defined as a global for reuse later!

if (db) {
  db.run('create table if not exists BaseQueries' +
         ' (Phrase varchar(255), Itemtype varchar(100))');
  db.run('create table if not exists BaseFeeds' + 
         ' (id varchar(255), JSON text)');
}

Đến đây, chúng ta có thể chắc chắn rằng mình có một bảng để lưu trữ các truy vấn và nguồn cấp dữ liệu. Mã new GearsDB(name) sẽ đóng gói việc mở một cơ sở dữ liệu có tên đã cho. Phương thức run bao bọc phương thức execute ở cấp thấp hơn, nhưng cũng xử lý đầu ra gỡ lỗi cho bảng điều khiển và các trường hợp ngoại lệ bắt lỗi.


Thêm cụm từ tìm kiếm

Trong lần đầu chạy ứng dụng, bạn sẽ không có nội dung tìm kiếm nào. Nếu bạn tìm kiếm một sản phẩm là Nintendo Wii, chúng tôi sẽ lưu cụm từ tìm kiếm này trong bảng BaseQueries.

Phiên bản Gears của phương thức addQuery thực hiện việc này bằng cách lấy dữ liệu đầu vào và lưu dữ liệu đó thông qua insertRow:

var searchterm = { Phrase: phrase, Itemtype: itemtype };
db.insertRow('BaseQueries', searchterm); 

insertRow lấy một đối tượng JavaScript (searchterm) và xử lý việc CHÈN đối tượng đó vào bảng cho bạn. Bạn cũng có thể xác định các quy tắc ràng buộc (ví dụ: quy tắc ràng buộc về tính duy nhất – ngăn chèn nhiều "Bob"). Tuy nhiên, hầu hết thời gian bạn sẽ xử lý những ràng buộc này trong chính cơ sở dữ liệu.


Lấy tất cả cụm từ tìm kiếm

Để điền sẵn danh sách các nội dung tìm kiếm trước đây, chúng ta sẽ sử dụng một trình bao bọc chọn đẹp mắt có tên là selectAll:

GearsBaseContent.prototype.getQueries = function() {
  return this.db.selectAll('select * from BaseQueries');
}

Thao tác này sẽ trả về một mảng các đối tượng JavaScript khớp với các hàng trong cơ sở dữ liệu (ví dụ: [ { Phrase: 'Nintendo Wii', Itemtype: 'product' }, { ... }, ...]).

Trong trường hợp này, bạn có thể trả về danh sách đầy đủ. Nhưng nếu có nhiều dữ liệu, bạn nên dùng một lệnh gọi lại trong lệnh gọi chọn để có thể thao tác trên từng hàng được trả về khi hàng đó xuất hiện:

 db.selectAll('select * from BaseQueries where Itemtype = ?', ['product'], function(row) {
  ... do something with this row ...
});

Sau đây là một số phương thức chọn hữu ích khác trong GearsDB:

selectOne(sql, args)Trả về đối tượng JavaScript đầu tiên/duy nhất khớp
selectRow(table, where, args, select)Thường được dùng trong các trường hợp đơn giản để bỏ qua SQL
selectRows(table, where, args, callback, select)Tương tự như selectRow, nhưng dành cho nhiều kết quả.

Tải nguồn cấp dữ liệu

Khi nhận được nguồn cấp dữ liệu kết quả từ Google Base, chúng ta cần lưu nguồn cấp dữ liệu đó vào cơ sở dữ liệu:

content.setFeed({ id: id, JSON: json.toJSONString() });

... which calls ...

GearsBaseContent.prototype.setFeed = function(feed) {
  this.db.forceRow('BaseFeeds', feed);
}

Trước tiên, chúng ta lấy nguồn cấp dữ liệu JSON và trả về dưới dạng một chuỗi bằng phương thức toJSONString. Sau đó, chúng ta tạo đối tượng feed và truyền đối tượng đó vào phương thức forceRow. forceRow sẽ CHÈN một mục nếu chưa có hoặc CẬP NHẬT một mục hiện có.


Hiển thị kết quả tìm kiếm

Ứng dụng của chúng tôi hiển thị kết quả cho một cụm từ tìm kiếm nhất định ở bảng điều khiển bên phải của trang. Sau đây là cách chúng tôi truy xuất nguồn cấp dữ liệu được liên kết với cụm từ tìm kiếm:

GearsBaseContent.prototype.getFeed = function(url) {
  var row = this.db.selectRow('BaseFeeds', 'id = ?', [ url ]);
  return row.JSON;
}

Giờ đây, khi đã có JSON cho một hàng, chúng ta có thể eval() để lấy lại các đối tượng:

eval("var json = " + jsonString + ";");

Chúng ta có thể bắt đầu nội dung innerHTML từ JSON vào trang của mình.


Sử dụng Kho tài nguyên để truy cập khi không có mạng

Vì chúng ta đang lấy nội dung từ cơ sở dữ liệu cục bộ, nên ứng dụng này cũng phải hoạt động được khi không có mạng, đúng không?

Không. Vấn đề là để khởi động ứng dụng này, bạn cần tải các tài nguyên web của ứng dụng, chẳng hạn như JavaScript, CSS, HTML và hình ảnh. Hiện tại, nếu người dùng thực hiện các bước sau, ứng dụng vẫn có thể hoạt động: bắt đầu trực tuyến, thực hiện một số lượt tìm kiếm, không đóng trình duyệt, chuyển sang chế độ ngoại tuyến. Cách này có thể hiệu quả vì các mục vẫn sẽ nằm trong bộ nhớ đệm của trình duyệt. Nhưng nếu không phải như vậy thì sao? Chúng tôi muốn người dùng có thể truy cập vào ứng dụng ngay từ đầu, sau khi khởi động lại, v.v.

Để làm việc này, chúng ta sẽ sử dụng thành phần LocalServer và ghi lại các tài nguyên. Khi bạn ghi lại một tài nguyên (chẳng hạn như HTML và JavaScript cần thiết để chạy ứng dụng), Gears sẽ lưu các mục này và cũng sẽ chặn các yêu cầu từ trình duyệt để trả về các mục đó. Máy chủ cục bộ sẽ đóng vai trò là người điều tiết lưu lượng truy cập và trả về nội dung đã lưu từ cửa hàng.

Chúng tôi cũng sử dụng thành phần ResourceStore. Thành phần này yêu cầu bạn cho hệ thống biết theo cách thủ công những tệp mà bạn muốn ghi lại. Trong nhiều trường hợp, bạn muốn tạo phiên bản cho ứng dụng và cho phép nâng cấp theo cách giao dịch. Một nhóm tài nguyên cùng nhau xác định một phiên bản và khi phát hành một nhóm tài nguyên mới, bạn sẽ muốn người dùng nâng cấp các tệp một cách liền mạch. Nếu đó là mô hình của bạn, thì bạn sẽ sử dụng ManagedResourceStore API.

Để ghi lại các tài nguyên của chúng ta, đối tượng GearsBaseContent sẽ:

  1. Thiết lập một mảng các tệp cần chụp
  2. Tạo LocalServer
  3. Mở hoặc tạo một ResourceStore mới
  4. Gọi ra để chụp các trang vào cửa hàng
// Step 1
this.storeName = 'gears-base';
this.pageFiles = [
  location.pathname,
  'gears_base.js',
  '../scripts/gears_db.js',
  '../scripts/firebug/firebug.js',
  '../scripts/firebug/firebug.html',
  '../scripts/firebug/firebug.css',
  '../scripts/json_util.js',    'style.css',
  'capture.gif' ];

// Step 2
try {
  this.localServer = google.gears.factory.create('beta.localserver', '1.0');
} catch (e) {
  alert('Could not create local server: ' + e.message);
  return;
}

// Step 3
this.store = this.localServer.openStore(this.storeName) || this.localServer.createStore(this.storeName);

// Step 4
this.capturePageFiles();

... which calls ...

GearsBaseContent.prototype.capturePageFiles = function() {
  this.store.capture(this.pageFiles, function(url, success, captureId) {
    console.log(url + ' capture ' + (success ? 'succeeded' : 'failed'));
  });
}

Điều quan trọng cần lưu ý ở đây là bạn chỉ có thể thu thập tài nguyên trên miền của riêng mình. Chúng tôi gặp phải hạn chế này khi cố gắng truy cập vào tệp JavaScript GearsDB trực tiếp từ tệp "gears_db.js" ban đầu trong SVN trunk. Giải pháp rất đơn giản: bạn cần tải mọi tài nguyên bên ngoài xuống và đặt chúng trong miền của mình. Xin lưu ý rằng lệnh chuyển hướng 302 hoặc 301 sẽ không hoạt động, vì LocalServer chỉ chấp nhận mã máy chủ 200 (Thành công) hoặc 304 (Không sửa đổi).

Điều này có ảnh hưởng. Nếu đặt hình ảnh trên images.yourdomain.com, bạn sẽ không thể thu thập hình ảnh. www1 và www2 không thể nhìn thấy nhau. Bạn có thể thiết lập các proxy phía máy chủ, nhưng điều đó sẽ làm mất mục đích phân chia ứng dụng của bạn thành nhiều miền.

Gỡ lỗi ứng dụng ngoại tuyến

Việc gỡ lỗi cho một ứng dụng ngoại tuyến sẽ phức tạp hơn một chút. Hiện có nhiều tình huống hơn để kiểm thử:

  • Tôi đang trực tuyến và ứng dụng đang chạy hoàn toàn trong bộ nhớ đệm
  • Tôi đang trực tuyến nhưng chưa truy cập vào ứng dụng và không có dữ liệu nào trong bộ nhớ đệm
  • Tôi đang ở chế độ ngoại tuyến nhưng đã truy cập vào ứng dụng
  • Tôi đang ở chế độ ngoại tuyến và chưa từng truy cập vào ứng dụng (không phải là nơi lý tưởng!)

Để đơn giản hoá, chúng tôi đã sử dụng mẫu sau:

  • Chúng tôi tắt bộ nhớ đệm trong Firefox (hoặc trình duyệt bạn chọn) khi cần đảm bảo rằng trình duyệt không chỉ lấy thông tin từ bộ nhớ đệm
  • Chúng tôi gỡ lỗi bằng Firebug (và Firebug Lite để kiểm thử trên các trình duyệt khác); chúng tôi sử dụng console.log() ở mọi nơi và phát hiện cho bảng điều khiển trong trường hợp cần thiết
  • Chúng tôi thêm mã JavaScript trợ giúp vào:
    • cho phép chúng ta xoá cơ sở dữ liệu và bắt đầu lại từ đầu
    • xoá các tệp đã chụp, vì vậy khi bạn tải lại, tệp sẽ truy cập vào Internet để lấy lại (hữu ích khi bạn đang lặp lại quá trình phát triển ;)

Tiện ích gỡ lỗi chỉ xuất hiện ở bên trái trang nếu bạn đã cài đặt Gears. Công cụ này có chú thích để dọn dẹp mã:

GearsBaseContent.prototype.clearServer = function() {
  if (this.localServer.openStore(this.storeName)) {
    this.localServer.removeStore(this.storeName);
    this.store = null;
  }
}

GearsBaseContent.prototype.clearTables = function() {
  if (this.db) {
    this.db.run('delete from BaseQueries');
    this.db.run('delete from BaseFeeds');
  }
  displayQueries();
}

Kết luận

Bạn có thể thấy rằng việc sử dụng Google Gears thực sự khá đơn giản. Chúng tôi đã sử dụng GearsDB để giúp thành phần Cơ sở dữ liệu trở nên dễ dàng hơn và sử dụng ResourceStore thủ công, hoạt động tốt trong ví dụ của chúng tôi.

Khoảng thời gian bạn dành nhiều nhất là xác định chiến lược về thời điểm lấy dữ liệu trực tuyến và cách lưu trữ dữ liệu khi không có mạng. Bạn cần dành thời gian để xác định giản đồ cơ sở dữ liệu. Nếu cần thay đổi giản đồ trong tương lai, bạn sẽ phải quản lý thay đổi đó vì người dùng hiện tại của bạn đã có một phiên bản cơ sở dữ liệu. Điều này có nghĩa là bạn sẽ cần gửi mã kịch bản cùng với mọi bản nâng cấp db. Rõ ràng là bạn nên giảm thiểu điều này và có thể dùng thử GearShift, một thư viện nhỏ có thể giúp bạn quản lý các bản sửa đổi.

Chúng ta cũng có thể sử dụng ManagedResourceStore để theo dõi các tệp của mình, với những hậu quả sau:

  • Chúng tôi sẽ là những công dân gương mẫu và tạo phiên bản cho các tệp của mình để có thể nâng cấp trong tương lai mà không gặp vấn đề gì
  • ManagedResourceStore có một tính năng cho phép bạn đặt bí danh cho một URL thành một phần nội dung khác. Một lựa chọn kiến trúc hợp lệ là gears_base.js là phiên bản không phải Gears và bí danh đó để chính Gears sẽ tải gears_base_withgears.js xuống. Tệp này sẽ có tất cả các tính năng hỗ trợ ngoại tuyến.
Đối với ứng dụng của mình, chúng tôi cảm thấy chỉ cần có một giao diện và triển khai giao diện đó theo hai cách là dễ dàng hơn.

Chúng tôi hy vọng bạn thấy việc chuẩn bị cho các ứng dụng thật thú vị và dễ dàng! Vui lòng tham gia diễn đàn Google Gears nếu bạn có câu hỏi hoặc ứng dụng muốn chia sẻ.